Volley JSONException:在字符0处输入结束

uplii1fm  于 12个月前  发布在  其他
关注(0)|答案(7)|浏览(93)

我看到其他人遇到过这个问题,但没有一个帖子能够帮助我。我试图使用Volley作为我的REST调用库,当我试图使用JSON Object作为参数的Put调用时,我得到了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对象,但我仍然得到相同的结果。

dsf9zpds

dsf9zpds1#

我也遇到过这个问题。
这并不一定是因为服务器端的问题-它只是意味着JsonObjectRequest的响应是空的。
很可能是服务器应该向你发送内容,而它的响应是空的这一事实是一个bug。然而,如果这是服务器应该采取的行为,那么为了解决这个问题,你需要改变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

h7wcgrx3

h7wcgrx32#

可能没有意义,但没有别的工作,但我添加一个内容类型的头

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

字符串

pprl5pva

pprl5pva3#

在我的情况下,这只是我发送的请求(POST)是不正确的。我交叉检查我的字段,并指出,有一个不匹配,这是服务器期望得到因此错误->结束输入的字符0的.

2vuwiymt

2vuwiymt4#

我也有同样的问题,我通过创建一个自定义的JsonObjectRequest来修复它,它可以捕获null或空响应:

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!

wqnecbli

wqnecbli5#

您需要检查服务器响应是否不为空。可能是一个空字符串“"。

if (response.success()) {
            if (response.getData() == null) {
                return null;
            } else if (response.getData().length() <= 0){
                return null;
            }

           // Do Processing
            try {

字符串

hs1rzwqc

hs1rzwqc6#

我也遇到过同样的问题,只是发生了一个愚蠢的小错误。
而不是

val jsonObject = JSONObject(response.body()?.string())

字符串

val jsonObject = JSONObject(response.body()!!.string())

5uzkadbs

5uzkadbs7#

如果你需要这个在Kotlin这个...

private fun deleteRequestWithToken(token: String, path: String, responseListener: Response.Listener<JSONObject?>, errorListener: Response.ErrorListener): JsonObjectRequest? {
        return object : JsonObjectRequest(Request.Method.DELETE, path, null, responseListener, errorListener) {
            @Throws(AuthFailureError::class)
            override fun getHeaders(): Map<String, String> {
                val headers = HashMap<String, String>()
                headers["Authorization"] = "Bearer $token"
                return headers
            }
            override fun parseNetworkResponse(response: NetworkResponse): Response<JSONObject>{
                try{
                    val jsonString = String(
                        response.data,
                        Charset.forName(HttpHeaderParser.parseCharset(response.headers))
                    )
                    var result: JSONObject? = null
                    if (jsonString != null && jsonString.length > 0) result = JSONObject(jsonString)
                    return Response.success<JSONObject?>(
                        result,
                        HttpHeaderParser.parseCacheHeaders(response)
                    )
                } catch (e: UnsupportedEncodingException)
                {
                    return Response.error(ParseError(e))
                } catch (je: JSONException)
                {
                    return Response.error(ParseError(je))
                }

            }
        }
    }

字符串

相关问题