![](/img/trans.png)
[英]Retrofit Post Request Error - java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
[英]JSON Error "java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $"
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 $
非常感謝您的幫助。
讓我們看看您收到的錯誤。
預期 BEGIN_OBJECT
您的 JSON 是一個對象,所有 JSON 對象都包含在花括號 ({}) 中。 因此 BEGIN_OBJECT 是 {。 它正在某處期待它。
但是是STRING
但相反,他發現了一個字符串“Something”。 仍然沒有告訴我們在哪里。
在第 1 行第 1 列路徑 $
啊,完美。 在第 1 行第 1 列。這是 JSON 的開始。 因此,您忘記將整個內容包含在 {} 中(或者至少您忘記了第一個,但我敢打賭您已經忘記了它們)。
清理和重建項目對我有用。
最近我遇到了類似的問題,只能通過在標題部分添加“接受:應用程序/json”來解決。 因此,如果您使用的是改造 2.0;
第一個解決方案:對於 post 方法添加 headers 參數,如下所示;
@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);
如果您的應用使用先前版本的存儲數據並且您更改了數據類型,您可能會遇到此錯誤。
例如:我在以前的版本中將某些內容存儲為字符串。 后來我將其中存儲了數據的類更新為對象類型。 當我運行它時,我收到了這個錯誤。 清除應用數據或重新安裝后,錯誤消失。
清除應用程序數據可能很容易解決。
解決方案
在 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)
}
}
}
}
響應 - Retrofit
ResponseBody-okHttp
響應是實際的 model 響應例如 UserResponse
在這里,getAPIData() 是 API 調用,它返回 ResponseBody 的 Response
apiResponseData是 MutableLiveData
使用它可以避免響應中的 JSON 類型轉換錯誤。
這是一個proguard問題。 在發布 minifyEnabled true 時打破了 API 模型。 您需要在 ResponseModel 和 RequestModel 中添加 Serializable API
清理並重建項目 這是由於 Gson 文件有些混亂造成的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.