JSON 错误"java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 pat


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());
    }

This create Exception

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

非常感谢你的帮助

让我们看看您收到的错误。

期望的BEGIN_OBJECT

JSON是一个对象,所有JSON对象都用大括号({})括起来。因此BEGIN_OBJECT是{。它在某处等待它

但是是STRING

但是他发现了一个字符串"Something"。还是没告诉我们在哪

在行1列1路径$

啊,完美的。在第一行第一列。这是JSON的开头。因此,您忘记了将整个内容括在{}中(或者至少您忘记了第一个,但我打赌您已经忘记了它们)。

最近我遇到了类似的问题,只有在标题部分添加"Accept: 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);

第二个解决方案:像这样在拦截器类中添加头文件;

注:代码在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)
        }
    }
}

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

清理和重建项目对我来说很有用。

如果你想在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);

如果你的应用使用的是以前版本的存储数据,而你改变了数据类型,你可能会遇到这个错误。

例如:在以前的版本中,我存储了一个字符串。稍后,我将存储数据的类更新为对象类型。当我运行它时,我得到了这个错误。清除应用程序数据或重新安装后,错误清除。

清除应用程序数据可能是一个简单的修复

SOLUTION

在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)
                }
            }
        }
    }

Response - Retrofit

responsebodyokhttp

响应为实际模型响应,例如UserResponse

这里,getAPIData()是返回ResponseBody的Response的API调用

apiResponseData is mutableelivedata

这是一个防护问题。在发布中minifyEnabled true打破了API模型。您需要在responsemmodel和RequestModel API中添加Serializable

https://i.stack.imgur.com/uHN22.png

相关内容

最新更新