от службы отдыха я получаю ниже ответ json
{"code":1,"message":"success","status":"success","users":[{"email":"[email protected]","name":"qq"},{"email":"[email protected]","name":"dd"},{"email":"[email protected]","name":"cc"},{"email":"[email protected]","name":"qq"},{"email":"[email protected]","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();
}
}
Где я пропустил. Спасибо за ваше драгоценное время
мне это не похоже на ошибку json. Можете ли вы опубликовать свой код вызова API
Ошибка не в преобразовании в JSONObject, а в потоковой передаче .body() с response. Обратите внимание на ошибку, исходящую от OkHttp Dispatcher. Это говорит о том, что ваше соединение уже закрыто. Вы должны показать больше контекста вашего кода, чтобы мы могли понять, что происходит.
@ Cᴏʀʏ, тогда что мне делать? Хорошо я обновлю
замените JSONObject на String JSONString = response.body().string() и проверьте, сохраняется ли исключение
Вы дважды вызываете response.body().string();, я имею в виду один раз для его регистрации, а другой - для преобразования в JsonObject и его обработки?
@LonelyCpp ДА осталось. Когда я регистрирую JSONString, он показывает ответ json, о котором я упоминал выше.
@FirozMemon да, я звоню дважды.
@EJChathuranga Не вызывать тело ответа более одного раза, так как оно читается как поток и не сохраняется в памяти Ссылка: github.com/square/okhttp/issues/1240
@FirozMemon, боже мой, вот в чем проблема. Почему мы не можем назвать это дважды, есть ли для этого какая-то причина.
@FirozMemon отлично. bCoz, я думаю, это асинхронно возбуждает.
@EJChathuranga Попробуйте сохранить его в переменной, а затем использовать эту переменную, а не код response.body().string(). Поскольку тело ответа может быть огромным, OkHttp не сохраняет его в памяти, а читает его как поток из сети, когда он вам нужен. Когда вы читаете тело как строку () OkHttp загружает тело ответа и возвращает его вам, не сохраняя ссылку на строку, его нельзя загрузить дважды без нового запроса.




Сначала проанализируйте объект, затем массив объектов следующим образом:
Не пытайтесь использовать 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");
Проблема заключалась в том, что я использовал response.body().string() дважды за очень короткий промежуток времени. Как говорится в комментариях @Firoz Memon.
Try storing it in a variable and then using the variable, not the response.body().string() code. Because response body can be huge so OkHttp doesn’t store it in memory, it reads it as a stream from network when you need it. When you read body as a string() OkHttp downloads response body and returns it to you without keeping reference to the string, it can’t be downloaded twice without new request.
скопировано из комментария @Firoz Memon сверху.
Оригинальная ссылка: https://github.com/square/okhttp/issues/1240
замените это «jsonObject = new JSONObject (response.body (). string ());» с «jsonObject = новый JSONObject (ответ);»