[英]How to parse the following error response from retrofit request?
我正在嘗試解析 retrofit 隊列的錯誤正文。 日志將 response.errorBody 顯示為
"{"response":["Image height must not exceed image width. Try a different image."]}"
這是我的代碼:
call.enqueue(new Callback<EditBlogResponse>() {
@Override
public void onResponse(Call<EditBlogResponse> call, Response<EditBlogResponse> response) {
if(response.body() != null){
Log.d(TAG, "onEditResponse: " + response.body());
editBlogResponse.setValue(response.body().toString());
}else{
try {
Log.d(TAG, "onResponseError: " + response.errorBody().string());
JSONObject jsonObject = new JSONObject(response.errorBody().string());
JSONArray jsonArray = jsonObject.getJSONArray("response");
editBlogResponse.setValue(jsonArray.getString(0));
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
}
}
@Override
public void onFailure(Call<EditBlogResponse> call, Throwable t) {
t.printStackTrace();
editBlogResponse.setValue("failure");
}
});
我收到系統錯誤
W/System.err: org.json.JSONException: End of input at character 0 of
at org.json.JSONTokener.syntaxError(JSONTokener.java:460)
at org.json.JSONTokener.nextValue(JSONTokener.java:101)
at org.json.JSONObject.<init>(JSONObject.java:164)
at org.json.JSONObject.<init>(JSONObject.java:181)
at com.example.brandonblog.Repository.Repository$3.onResponse(Repository.java:176)
at retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall$1$1.run(DefaultCallAdapterFactory.java:83)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
關於我做錯了什么的任何想法?
好吧,在這種情況下,您的預期響應也在onResponse()
塊內。 您必須像這樣查找400
或4xx
狀態代碼的塊:
if(response.code() != 200) {
Log.d(TAG, "onEditResponseCode: " + response.code());
Log.d(TAG, "onEditResponse: " + response.body());
editBlogResponse.setValue(response.body().toString());
} else {
Log.d(TAG, "onEditResponsecode: " + response.code());
Log.d(TAG, "onEditResponse: " + response.body().response.get(0));
//because your message is always at the 0th position of the 'response' list
// You don't need to use any JSONObject or JSONArray etc for these.
}
嘗試讓我知道它是否有效。
得到它的工作,問題是這一行:
editBlogResponse.setValue(jsonArray.getString(0));
而不是 getString,它應該是 get():
editBlogResponse.setValue(array.get(0).toString());
完整的工作響應:
public void onResponse(Call<EditBlogResponse> call, Response<EditBlogResponse> response) {
if(response.body() != null){
Log.d(TAG, "onEditResponse: " + response.body());
editBlogResponse.setValue(response.body().toString());
}else{
try {
JSONObject jObjError = new JSONObject (response.errorBody().string());
JSONArray array = jObjError.getJSONArray("response");
editBlogResponse.setValue(array.get(0).toString());
} catch (JSONException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
請嘗試使用下面描述的 POJO 來解析 JSON。
public class EditBlogResponse {
@SerializedName("response")
@Expose
private List<String> response = null;
public List<String> getResponse() {
return response;
}
public void setResponse(List<String> response) {
this.response = response;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.