簡體   English   中英

如何解析來自 retrofit 請求的以下錯誤響應?

[英]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()塊內。 您必須像這樣查找4004xx狀態代碼的塊:

  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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM