改造response.errorBody()为null

Fus*_*dor 2 android json retrofit okhttp

我正在做一些REST调用,并获得响应.有时,响应不会正常,所以我需要解析响应,并以适当的方式呈现它以供用户注意并做出反应.我有这个代码:

if(response.code()!=200){
      JSONArray jsonError=null;
      try {
         Log.i("David", "Incorrect response: "+response.errorBody().string());

         jsonError = new JSONArray(response.errorBody().string());//After this line, jsonError is null
         JSONObject message=jsonError.getJSONObject(0);

         String errorJson=message.getString("message");
         Log.i("David", "Error received: "+errorJson);
         AlertDialog.Builder dialog=new AlertDialog.Builder(getActivity());
         dialog.setTitle(getString(R.string.error));
         dialog.setMessage(getString(R.string.errorfound) + errorJson);
         dialog.setPositiveButton(getString(R.string.aceptar), new DialogInterface.OnClickListener() {
             @Override
             public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
              }
                  });
                            dialog.show();
                        } catch (IOException e) {
                            e.printStackTrace();
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }

                    }
Run Code Online (Sandbox Code Playgroud)

这样,日志行"错误响应"显示完美,包含错误代码,消息等.这是收到的JSON:

[{"coderror":"-2","gravedad":"1","message":"Device imei 34543564768463435345 not logged in","cause":""}]
Run Code Online (Sandbox Code Playgroud)

我的问题是,正如我所说,日志记录工作正常,但是当我尝试将JSON转换为JsonArray时......它失败了.在下一行中,JsonError对象变为null.

为什么我不能解析回复?谢谢.

BNK*_*BNK 10

正如我所评论的,你应该使用String s = response.errorBody().string();then Log.i("David", "Incorrect response: "+ s;jsonError = new JSONArray(s);.不要打response.errorBody().string()两次电话.

如果你尝试/ catch IllegalStateException,Exception你会在logcat上看到如下信息

W/System.err: java.lang.IllegalStateException: closed
W/System.err:     at com.squareup.okhttp.internal.http.HttpConnection$FixedLengthSource.read(HttpConnection.java:415)
W/System.err:     at okio.Buffer.writeAll(Buffer.java:956)
W/System.err:     at okio.RealBufferedSource.readByteArray(RealBufferedSource.java:92)
W/System.err:     at com.squareup.okhttp.ResponseBody.bytes(ResponseBody.java:57)
W/System.err:     at com.squareup.okhttp.ResponseBody.string(ResponseBody.java:83)
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!