我从REST服务中收到以下json respoonse
{"code":1,"message":"success","status":"success","users":[{"email":"qqq@aa.aa","name":"qq"},{"email":"dd@dd.dd","name":"dd"},{"email":"cc@vv.vv","name":"cc"},{"email":"qq@qq.qq","name":"qq"},{"email":"qq@qq.qq","name":"qq"}]}
当我尝试将其转换为JSONObject时,会引发错误, 这就是我尝试提取JSON响应的方式,
jsonObject = new JSONObject(response.body().string());
从上面的脚本抛出错误。错误在下面,
E/AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher
Process: com.example.ej.ziphiotest, PID: 21945
java.lang.IllegalStateException: closed
at okio.RealBufferedSource.rangeEquals(RealBufferedSource.java:408)
at okio.RealBufferedSource.rangeEquals(RealBufferedSource.java:402)
at okhttp3.internal.Util.bomAwareCharset(Util.java:432)
at okhttp3.ResponseBody.string(ResponseBody.java:174)
at com.example.ej.ziphiotest.requests.UserRequest$1.onResponse(UserRequest.java:85)
at okhttp3.RealCall$AsyncCall.execute(RealCall.java:153)
at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
编辑:
这是请求:
final Request request = new Request.Builder()
.header("key", params[0])
.url(URL)
.build();
try {
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
call.cancel();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.code() == 200){
try {
jsonObject = new JSONObject(response.body().string());
restResponse = new RestResponse(jsonObject.getString("status"), jsonObject.getString("code"), jsonObject.getString("message"), null, jsonObject.getJSONArray("users"));
onTaskComplete.onTaskComplete(restResponse);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
我错过的地方。谢谢您的宝贵时间
答案 0 :(得分:1)
问题是我在很短的时间内两次使用response.body().string()
。如@Firoz Memon在评论中所说。
尝试将其存储在变量中,然后使用变量,而不是response.body()。string()代码。由于响应主体可能很大,因此OkHttp不会将其存储在内存中,因此它会在需要时将其作为来自网络的流读取。当您将主体读为字符串()时,OkHttp会下载响应主体并将其返回给您而又不保留对该字符串的引用,因此,如果没有新的请求,就无法将其下载两次。
从@Firoz Memon的上方评论中复制。
答案 1 :(得分:0)
首先解析Object然后解析Object数组,如下所示:
不要尝试直接使用response.body.string()。就像下面这样使用:
ResponseBody responseBody = response.body();
String content = responseBody.string();
// Do something with "content" variable
原因: 正文字符串存储在内存中以包含可变内容,因此我们无需关心状态是否关闭。
JSONObject jsonObject = new JSONObject(content);
JSONArray jsonArray =jsonObject.getJSONArray("users");