Java 如何解析改装请求中的以下错误响应?

Java 如何解析改装请求中的以下错误响应?,java,android,json,retrofit,retrofit2,Java,Android,Json,Retrofit,Retrofit2,我正在尝试解析改装队列的错误主体。日志将response.errorBody显示为 "{"response":["Image height must not exceed image width. Try a different image."]}" 这是我的密码: call.enqueue(new Callback<EditBlogResponse>() { @Override public void onResponse(Call

我正在尝试解析改装队列的错误主体。日志将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");
            }
        });
call.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
if(response.body()!=null){
Log.d(标记“onEditResponse:+response.body());
editBlogResponse.setValue(response.body().toString());
}否则{
试一试{
Log.d(标记“onResponseError:+response.errorBody().string());
JSONObject=newJSONObject(response.errorBody().string());
JSONArray JSONArray=jsonObject.getJSONArray(“响应”);
setValue(jsonArray.getString(0));
}捕获(IOE异常){
e、 printStackTrace();
}捕获(JSONException e){
e、 printStackTrace();
}
}
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
t、 printStackTrace();
editBlogResponse.setValue(“失败”);
}
});
我收到一个系统错误

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)
W/System.err:org.json.JSONException:输入结束于的字符0处
位于org.json.JSONTokener.syntaxError(JSONTokener.java:460)
位于org.json.JSONTokener.nextValue(JSONTokener.java:101)
位于org.json.JSONObject(JSONObject.java:164)
位于org.json.JSONObject(JSONObject.java:181)
位于com.example.brandonblog.Repository.Repository$3.onResponse(Repository.java:176)
在Reformation2.DefaultCallAdapterFactory$ExecutorCallbackCall$1$1.run(DefaultCallAdapterFactory.java:83)
位于android.os.Handler.handleCallback(Handler.java:883)
位于android.os.Handler.dispatchMessage(Handler.java:100)
位于android.os.Looper.loop(Looper.java:214)
位于android.app.ActivityThread.main(ActivityThread.java:7356)
位于java.lang.reflect.Method.invoke(本机方法)
位于com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
位于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));
它应该是get(),而不是getString:

完整工作响应:

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();
        }
    }
}
public void onResponse(调用、响应){
if(response.body()!=null){
Log.d(标记“onEditResponse:+response.body());
editBlogResponse.setValue(response.body().toString());
}否则{
试一试{
JSONObject jObjError=新的JSONObject(response.errorBody().string());
JSONArray数组=jObjError.getJSONArray(“响应”);
editBlogResponse.setValue(array.get(0.toString());
}捕获(JSONException e){
e、 printStackTrace();
}捕获(IOE异常){
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;
}

}
公共类EditBlogResponse{
@SerializedName(“响应”)
@暴露
私有列表响应=null;
公共列表getResponse(){
返回响应;
}
公共无效设置响应(列表响应){
这个。反应=反应;
}
}

你好,布兰登,欢迎来到SO。你需要在这里提供一些东西。改装版本、类
EditBlogResponse
和整个日志堆栈跟踪,哪一行导致异常?存储库中的
行是什么。java:176
?您对成功和失败有不同的反应吗?邮递员的
反应代码是什么?如果它显示
200
2xx
,则您将能够在
onSuccess()中找到
错误消息
。请与use共享您的
服务器响应
,以便我们可以帮助您。您好,这里是邮差错误响应:
{“response”:[“输入长度超过50个字符的正文”。]}
400响应。是的,回答是不同的。行是'JSONObject JSONObject=newjsonobject(response.errorBody().string())`更新了完整的堆栈跟踪,谢谢,我们同时发布了,是的,你的方法也有效。谢谢@布兰登,不客气。为什么要使用额外的包来实现这一点,而我的答案将其分解为几行,对吗?所以,你能不能让我的回答正确。这将是一个巨大的赞赏。快乐编码。
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;
}

}