web-dev-qa-db-fra.com

Volley JSONException: Fin de la saisie au caractère de

J'ai vu d'autres personnes rencontrer ce problème, mais aucun poste n'a pu m'aider. J'essaie d'utiliser Volley pour ma bibliothèque d'appels REST et lorsque j'essaie d'utiliser un appel Put avec un objet JSON en tant que paramètre, j'obtiens error with: org.json.JSONException: End of input at character 0 of

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

Le journal jsonParams affiche:

json: {"statusId":"1"}

Y a-t-il un autre paramètre qui me manque? Il semble que la demande ne puisse pas analyser l'objet JSON. J'ai même essayé de créer un HashMap, puis de l'utiliser pour créer un objet JSON, mais j'obtiens toujours le même résultat.

14
Mike Walker

Moi aussi j'ai rencontré ce problème.

Ce n'est pas nécessairement vrai, c'est parce qu'il y a un problème côté serveur. Cela signifie simplement que la réponse de la variable JsonObjectRequest est vide.

Il se pourrait très bien que le serveur vous envoie du contenu, et le fait que sa réponse soit vide est un bogue. Si, toutefois, le serveur est censé se comporter ainsi, pour résoudre ce problème, vous devez modifier la façon dont JsonObjectRequest analyse sa réponse, ce qui signifie créer une sous-classe de JsonObjectRequest et remplacer le parseNetworkResponse par l'exemple ci-dessous.

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

Gardez à l'esprit qu'avec ce correctif et en cas de réponse vide du serveur, le rappel de la demande retournera une référence null à la place de la variable JSONObject.

37
Gil Moshayof

Cela n'a peut-être pas de sens, mais rien d'autre n'a fonctionné pour moi, mais l'ajout d'un en-tête de type contenu

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

J'ai eu le même problème, je l'ai corrigé en créant un JsonObjectRequest personnalisé qui peut intercepter une réponse nulle ou vide:

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

Il suffit ensuite de remplacer le JsonObjectRequest par défaut par celui-ci!

0
kamel sabri

Dans mon cas, c’était simplement que la demande que j’envoyais (POST) n’était pas correcte. J'ai revérifié mes champs et noté qu'il y avait une incompatibilité, ce que le serveur s'attendait à obtenir ainsi l'erreur-> fin d'entrée au caractère 0 de ...

0
Bryan Ibrahim