извлечение значений из ответа JSON - PullRequest
0 голосов
/ 14 ноября 2018

из службы отдыха я получаю ниже 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)

EDIT:

Это запрос:

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();
    }


}

Где я пропустил. Спасибо за ваше драгоценное время

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Проблема заключалась в том, что я использовал response.body().string() дважды за очень короткое время.AS @ Firoz Memon высказывание в комментариях.

Попробуйте сохранить его в переменной и затем использовать переменную, а не код response.body (). String ().Поскольку тело ответа может быть огромным, поэтому OkHttp не сохраняет его в памяти, он читает его как поток из сети, когда вам это нужно.Когда вы читаете тело как строку () OkHttp загружает тело ответа и возвращает его вам, не сохраняя ссылку на строку, его нельзя загрузить дважды без нового запроса.

скопировано с @Firoz Memon комментирует сверху.

Оригинальный номер: https://github.com/square/okhttp/issues/1240

0 голосов
/ 14 ноября 2018

Сначала анализируйте объект, затем массив объектов следующим образом:
Не пытайтесь напрямую использовать response.body.string ().Просто используйте как показано ниже:

ResponseBody responseBody = response.body();
String content = responseBody.string();
// Do something with "content" variable

Причина: строка body хранится в памяти для переменного содержимого, поэтому нам не нужно заботиться о том, закрыто ли состояние.

 JSONObject jsonObject = new JSONObject(content);
    JSONArray jsonArray =jsonObject.getJSONArray("users");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...