wake-up-neo.com

Volley JSONException: Ende der Eingabe bei Zeichen von

Ich habe gesehen, dass andere auf dieses Problem gestoßen sind, aber keiner der Posts konnte mir helfen. Ich versuche, Volley für meine REST - Aufrufbibliothek zu verwenden, und wenn ich versuche, einen Put-Aufruf mit einem JSON-Objekt als Parameter zu verwenden, erhalte ich error with: org.json.JSONException: End of input at character 0 of

Hier ist der 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);
    }
}

Das jsonParams-Protokoll zeigt Folgendes an:

json: {"statusId":"1"}

Gibt es eine andere Einstellung, die ich vermisse? Es scheint, dass die Anforderung das JSON-Objekt nicht analysieren kann. Ich habe sogar versucht, eine HashMap zu erstellen und diese dann zum Erstellen eines JSON-Objekts zu verwenden, aber ich bekomme immer noch dasselbe Ergebnis.

14
Mike Walker

Auch ich bin diesem Problem begegnet.

Es ist nicht notwendigerweise wahr, dass dies auf ein Problem auf Ihrer Serverseite zurückzuführen ist. Dies bedeutet lediglich, dass die Antwort von JsonObjectRequest leer ist.

Es kann durchaus sein, dass der Server Ihnen Inhalte sendet, und die Tatsache, dass die Antwort leer ist, ist ein Fehler. Wenn sich der Server jedoch so verhalten soll, müssen Sie, um dieses Problem zu lösen, ändern, wie JsonObjectRequest seine Antwort parst, das heißt, eine Unterklasse von JsonObjectRequest erstellen und die parseNetworkResponse-Instanz überschreiben.

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

Beachten Sie, dass mit diesem Fix und im Falle einer leeren Antwort des Servers der Anforderungsrückruf anstelle von JSONObject eine Nullreferenz zurückgibt.

37
Gil Moshayof

Es macht vielleicht keinen Sinn, aber für mich hat sich nichts anderes ergeben, als einen inhaltlichen Header hinzuzufügen

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

Ich hatte das gleiche Problem. Ich habe es behoben, indem ich ein benutzerdefiniertes JsonObjectRequest erstellt habe, das eine leere oder leere Antwort abfangen kann:

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

Dann ersetzen Sie einfach das Standard-JsonObjectRequest durch dieses!

0
kamel sabri

In meinem Fall war die Anforderung, die ich (POST) schickte, nicht korrekt. Ich überprüfte meine Felder und stellte fest, dass es eine Nichtübereinstimmung gab, die der Server erwartete, also den Fehler-> Ende der Eingabe bei Zeichen 0 von ...

0
Bryan Ibrahim