我正在做一些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();
}
}
这样,记录行"错误的响应"完美显示,包含错误代码,消息等。这是收到的JSON:
[{"coderror":"-2","gravedad":"1","message":"Device imei 34543564768463435345 not logged in","cause":""}]
我的问题是,正如我所说,日志记录工作正常,但是当我尝试将JSON转换为JsonArray时......它失败了。在下一行中,JsonError对象变为null。
为什么我无法解析回复?谢谢。
答案 0 :(得分:8)
正如我所评论的那样,您应该使用String s = response.errorBody().string();
然后使用Log.i("David", "Incorrect response: "+ s;
和jsonError = new JSONArray(s);
。不要两次致电response.errorBody().string()
。
如果您尝试/捕捉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)
希望它有所帮助!