it-roy-ru.com

Залп JSONException: конец ввода в символ

Я видел, как другие сталкивались с этой проблемой, но ни один из постов не смог мне помочь. Я пытаюсь использовать Volley для моей библиотеки вызовов REST, и когда я пытаюсь использовать вызов Put с объектом JSON в качестве параметра, я получаю error with: org.json.JSONException: End of input at character 0 of

Вот код:

protected void updateClientDeviceStatus(Activity activity, final int status) {
    JSONObject jsonParams = new JSONObject();
    try {
        jsonParams.put("statusId", String.valueOf(status));
    } catch (JSONException e1) {
        e1.printStackTrace();
    }
    Log.i(LOG_TAG, "json: " + jsonParams.toString());

    String url = Constants.API_URL + "client/device/" + getDeviceId();
    // Request a response from the provided URL.
    JsonObjectRequest request = new JsonObjectRequest
            (Request.Method.PUT, url, jsonParams, new Response.Listener<JSONObject>() {

                @Override
                public void onResponse(JSONObject response) {
                    Log.i(LOG_TAG, "updated client status");
                    Log.i(LOG_TAG, "response: " + response.toString());
                }
            }, new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.i(LOG_TAG, "error with: " + error.getMessage());
                    if (error.networkResponse != null)
                        Log.i(LOG_TAG, "status code: " + error.networkResponse.statusCode);


                }
            }) {

        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String, String>  params = new HashMap<String, String>();
            params.put("User-Agent", getUserAgent());
            params.put("X-BC-API", getKey());

            return params;
        }

        @Override
        public String getBodyContentType() {
            return "application/json";
        }
    };

    request.setRetryPolicy(new DefaultRetryPolicy(20000, 3, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    MySingleton.getInstance(activity).addToRequestQueue(request);
    }
}

Журнал jsonParams отображает:

json: {"statusId":"1"}

Есть еще какие-то настройки, которые мне не хватает? Похоже, что запрос не может проанализировать объект JSON. Я даже пытался создать HashMap, а затем использовать его для создания объекта JSON, но я все еще получаю тот же результат.

14
Mike Walker

Я тоже столкнулся с этой проблемой.

Это не обязательно так, потому что проблема на стороне вашего сервера - это просто означает, что ответ JsonObjectRequest пуст.

Вполне возможно, что сервер должен отправлять вам контент, и тот факт, что его ответ пуст, является ошибкой. Если, однако, именно так и должен себя вести сервер, то для решения этой проблемы вам нужно изменить способ анализа ответа JsonObjectRequest, то есть создать подкласс JsonObjectRequest и переопределить parseNetworkResponse в приведенном ниже примере.

    @Override
    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
        try {
            String jsonString = new String(response.data,
                    HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET));

            JSONObject result = null;

            if (jsonString != null && jsonString.length() > 0)
                 result = new JSONObject(jsonString);

            return Response.success(result,
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        } catch (JSONException je) {
            return Response.error(new ParseError(je));
        }
    } 

Имейте в виду, что с этим исправлением и в случае пустого ответа от сервера обратный вызов запроса будет возвращать нулевую ссылку вместо JSONObject.

37
Gil Moshayof

Не имеет смысла, но у меня ничего не получалось, кроме добавления заголовка типа контента

mHeaders.put("Content-Type", "application/json");
1
blackout

У меня была та же проблема, я исправил ее, создав собственный JsonObjectRequest, который может перехватывать пустой или пустой ответ:

public class CustomJsonObjectRequest extends JsonObjectRequest {

public CustomJsonObjectRequest(int method, String url, JSONObject jsonRequest, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) {
    super(method, url, jsonRequest, listener, errorListener);
}

public CustomJsonObjectRequest(String url, JSONObject jsonRequest, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) {
    super(url, jsonRequest, listener, errorListener);
}

@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
    try {
        String jsonString = new String(response.data,
                HttpHeaderParser.parseCharset(response.headers));

        JSONObject result = null;

        if (jsonString != null && jsonString.length() > 0)
            result = new JSONObject(jsonString);

        return Response.success(result,
                HttpHeaderParser.parseCacheHeaders(response));
    } catch (UnsupportedEncodingException e) {
        return Response.error(new ParseError(e));
    } catch (JSONException je) {
        return Response.error(new ParseError(je));
    }
}

Затем просто замените JsonObjectRequest по умолчанию на этот!

0
kamel sabri

В моем случае это был просто неверный запрос, который я отправлял (POST). Я перепроверил свои поля и заметил, что произошло несоответствие, которое сервер ожидал получить, таким образом, ошибка-> конец ввода с символом 0 of ...

0
Bryan Ibrahim