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