Volley JSONException: End of input at character 0 of

26,265

Solution 1

I also have encountered this issue.

It's not necessarily true that this is because a problem on your server side - it simply means that the response of the JsonObjectRequest is empty.

It could very well be that the server should be sending you content, and the fact that its response is empty is a bug. If, however, this is how the server is supposed to behave, then to solve this issue, you will need to change how JsonObjectRequest parses its response, meaning creating a subclass of JsonObjectRequest, and overriding the parseNetworkResponse to the example below.

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

Keep in mind that with this fix, and in the event of an empty response from the server, the request callback will return a null reference in place of the JSONObject.

Solution 2

Might not make sense but nothing else worked for me but adding a content-type header

mHeaders.put("Content-Type", "application/json");
Share:
26,265
Mike Walker
Author by

Mike Walker

Updated on August 16, 2022

Comments

  • Mike Walker
    Mike Walker over 1 year

    I've seen others come across this problem, but none of the posts have been able to assist me. I'm attempting to use Volley for my REST call library, and when I'm attempting to use a Put call with a JSON Object as a parameter, I'm getting error with: org.json.JSONException: End of input at character 0 of.

    Here is the code:

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

    The jsonParams log displays:

    json: {"statusId":"1"}
    

    Is there another setting that I'm missing? It appears that the request can't parse the JSON Object. I even tried creating a HashMap and then using that to create a JSON Object, but I still get the same result.