Volley JSONException: Конец ввода символа 0

Я видел, как другие сталкиваются с этой проблемой, но ни одна из этих должностей мне не помогла. Я пытаюсь использовать 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, но я все равно получаю тот же результат.

Ответ 1

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

Не обязательно, что это потому, что проблема на вашей стороне сервера - это просто означает, что ответ 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.

Ответ 2

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

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