gson JSON错误“Java.lang.应为开始_OBJECT,但在路径$”的第1行第1列为STRING

wribegjk  于 2022-11-06  发布在  Java
关注(0)|答案(7)|浏览(192)
public interface UserService {
    @POST(Constants.Api.URL_REGISTRATION)
    @FormUrlEncoded
    BaseWrapper registerUser(@Field("first_name") String firstname, @Field("last_name") String lastname, @Field("regNumber") String phone, @Field("regRole") int role);

 public BaseWrapper registerUser(User user) {
        return getUserService().registerUser(user.getFirstName(), user.getLastName(), user.getPhone(), user.getRole());
    }

此创建例外

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $

非常感谢你的帮助。

wwwo4jvm

wwwo4jvm1#

让我们看看您收到的错误。
必须是开始_OBJECT
JSON是一个对象,所有JSON对象都用大括号({})括起来。因此开始_OBJECT是{。它在某个地方期待它。
但为字符串
但他找到了一串“什么东西”。还是没告诉我们在哪。
在第1行第1列路径$
啊,太好了。在第1行第1列。这是JSON的开始。所以你忘记了用{}括起整个内容(或者至少你忘记了第一个,但我敢打赌你忘记了两个)。

ou6hu8tu

ou6hu8tu2#

最近我也遇到过类似的问题,只有通过添加**“接受:application/json”**插入到标题部分。因此,如果您使用的是retrofit 2.0;

**第一个解决方案:**对于post方法,添加如下所示的头参数;

@Headers({"Accept: application/json"})
@POST(Constants.Api.URL_REGISTRATION)
@FormUrlEncoded
BaseWrapper registerUser(@Field("first_name") String firstname, 
                         @Field("last_name") String lastname, 
                         @Field("regNumber") String phone, 
                         @Field("regRole") int role);

**第二个解决方案:**将header添加到拦截器类中,如下所示;

NB:代码以Kotlin为单位

private fun getInterceptor(): Interceptor {
        try {
            return Interceptor {
                val request = it.request()
                it.proceed(
                    request.newBuilder()
                        .header("Accept", "application/json")
                        .header("Authorization", "$accessTokenType $accessToken")
                        .build()
                )
            }
        } catch (exception: Exception) {
            throw Exception(exception.message)
        }
    }
}

希望它有帮助,快乐编码:)

hs1ihplo

hs1ihplo3#

清理和重建项目对我很有效。

yftpprvb

yftpprvb4#

如果你想在json对象中添加ArrayList并在GSON中解析,那么确保ArrayList应该如下所示。

ArrayList<JSONObject>

而不是

ArrayList<String>

和解析。

ArrayList<JSONObject> mItem = new ArrayList<JSONObject>();
mItem.add(jsonObject);

// and Use like this.
JSONArray list = new JSONArray(mItem);
jsonObject.put("Item",list);
ukdjmx9f

ukdjmx9f5#

如果您的应用使用的是以前版本的存储数据,而您更改了数据类型,则可能会遇到此错误。
例如:在我的前一个版本中,我将一些内容存储为字符串。后来我将存储数据的类更新为对象类型。当我运行它时,我得到了这个错误。在清除应用程序数据或重新安装它后,错误清除。
清除应用程序数据可能是一个简单的解决办法。

xv8emn3q

xv8emn3q6#

解决方案
在Kotlin中,我们可以使用ResponseBody的Response并在其中管理初始响应。

viewModelScope.launch(Dispatchers.IO) {
        mainRepository.getAPIData(
            Constants.getRequestBody(requestBody.toString())
        ).let { it ->
            if (it.isSuccessful && it.code() == 200) {
                val responseBody = it.body()
                val res: String? = responseBody?.string()
                try {
                    val main = JSONObject(res!!)
                    Log.e("TAG", "onSuccess: " + main.toString())
                    if (main.getInt("StatusCode") == 200) {
                        val type = object : TypeToken<Response>() {}.type
                        val response: Response = Gson().fromJson(
                            main.toString(), type
                        )
                        Log.e("TAG", "onSuccess: " + response.toString())
                    } else {
                        apiResponseData.postValue(Resource.error(main.getString("Message"), null))
                        Log.e("TAG", "onFail: " + main.toString())
                    }
                } catch (exception: JSONException) {
                    Log.e("TAG", "Exception: " + exception.message)
                }
            }
        }
    }

响应-改装
响应正文- okHttp
响应是实际模型响应,例如UserResponse

这里,getAPIData()是API调用,返回响应主体的响应

apiResponseData是可变实时数据

使用它可以避免响应中的JSON类型转换错误。

6pp0gazn

6pp0gazn7#

这是一个proguard问题。在minifyEnabled true版本中破坏了API模型。您需要在ResponseModel和RequestModel API中添加可序列化
https://i.stack.imgur.com/uHN22.png

相关问题