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

wribegjk  于 2022-11-06  发布在  Java
关注(0)|答案(7)|浏览(199)
  1. public interface UserService {
  2. @POST(Constants.Api.URL_REGISTRATION)
  3. @FormUrlEncoded
  4. BaseWrapper registerUser(@Field("first_name") String firstname, @Field("last_name") String lastname, @Field("regNumber") String phone, @Field("regRole") int role);
  5. public BaseWrapper registerUser(User user) {
  6. return getUserService().registerUser(user.getFirstName(), user.getLastName(), user.getPhone(), user.getRole());
  7. }

此创建例外

  1. 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方法,添加如下所示的头参数;

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

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

NB:代码以Kotlin为单位

  1. private fun getInterceptor(): Interceptor {
  2. try {
  3. return Interceptor {
  4. val request = it.request()
  5. it.proceed(
  6. request.newBuilder()
  7. .header("Accept", "application/json")
  8. .header("Authorization", "$accessTokenType $accessToken")
  9. .build()
  10. )
  11. }
  12. } catch (exception: Exception) {
  13. throw Exception(exception.message)
  14. }
  15. }
  16. }

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

展开查看全部
hs1ihplo

hs1ihplo3#

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

yftpprvb

yftpprvb4#

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

  1. ArrayList<JSONObject>

而不是

  1. ArrayList<String>

和解析。

  1. ArrayList<JSONObject> mItem = new ArrayList<JSONObject>();
  2. mItem.add(jsonObject);
  3. // and Use like this.
  4. JSONArray list = new JSONArray(mItem);
  5. jsonObject.put("Item",list);
ukdjmx9f

ukdjmx9f5#

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

xv8emn3q

xv8emn3q6#

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

  1. viewModelScope.launch(Dispatchers.IO) {
  2. mainRepository.getAPIData(
  3. Constants.getRequestBody(requestBody.toString())
  4. ).let { it ->
  5. if (it.isSuccessful && it.code() == 200) {
  6. val responseBody = it.body()
  7. val res: String? = responseBody?.string()
  8. try {
  9. val main = JSONObject(res!!)
  10. Log.e("TAG", "onSuccess: " + main.toString())
  11. if (main.getInt("StatusCode") == 200) {
  12. val type = object : TypeToken<Response>() {}.type
  13. val response: Response = Gson().fromJson(
  14. main.toString(), type
  15. )
  16. Log.e("TAG", "onSuccess: " + response.toString())
  17. } else {
  18. apiResponseData.postValue(Resource.error(main.getString("Message"), null))
  19. Log.e("TAG", "onFail: " + main.toString())
  20. }
  21. } catch (exception: JSONException) {
  22. Log.e("TAG", "Exception: " + exception.message)
  23. }
  24. }
  25. }
  26. }

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

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

apiResponseData是可变实时数据

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

展开查看全部
6pp0gazn

6pp0gazn7#

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

相关问题