Как разобрать следующий ответ об ошибке из запроса на модернизацию? - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь проанализировать тело ошибки в очереди на модернизацию. Журнал показывает 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)

Любые идеи о том, что яя делаю не так?

Ответы [ 3 ]

0 голосов
/ 10 октября 2019

Работает, проблема была в следующей строке:

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();
        }
    }
}
0 голосов
/ 11 октября 2019

Пожалуйста, попробуйте с помощью описанного ниже 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;
}

}
0 голосов
/ 10 октября 2019

Ну, в этом случае ваш ожидаемый ответ также находится внутри блока 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.
  }

Попробуйте и дайте мне знать, работает ли он.

...