【问题标题】:Volley JSONException: End of input at character 0 ofVolley JSONException:输入在字符 0 处结束
【发布时间】:2015-11-13 06:42:45
【问题描述】:

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

【问题讨论】:

  • 此错误来自您的服务器端。由于来自服务器的响应没有以正确的 json 格式发送。使用 PostMan 或任何其他 API 测试环境确保 api 是否正常工作。
  • 尝试使用Request.Method.POST
  • 响应为空。如果响应中返回的字符串为空,则调用 JSON 异常。空字符串不能转换为 JSON 对象——它可能为 null,但库决定改为抛出异常。如果您根本没有收到回复,您可以简单地使用 StringRequest。

标签: java android json rest android-volley


【解决方案1】:

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

而不是

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

应该是

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

【讨论】:

    【解决方案2】:

    您需要检查服务器响应是否为空。也许它可能是一个空字符串“”。

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

    【讨论】:

      【解决方案3】:

      我也遇到过这个问题。

      这不一定是因为您的服务器端出现问题 - 它只是意味着 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

      【讨论】:

      • 谢谢。那成功了。为我节省了好几个小时的头痛
      • 我认为我们可以在没有子类的情况下直接在这个请求中覆盖这个方法。
      • 这就是所谓的匿名子类 :)
      • 我会说或复制的答案不完整,如果您发布要使用的适当代码会更好。
      • @quicklearner - 绝对没有被复制(正如我所说,我也遇到了这个问题,这就是我解决它的方法)。此外,还有大约 25 个人不同意您的“不完整”评估。发布了适当的代码。如果你提供了一些关于你觉得缺少什么的信息,也许我可以提供更多信息。
      【解决方案4】:

      我遇到了同样的问题,我通过创建一个可以捕获 null 或空响应的自定义 JsonObjectRequest 来解决它:

      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吧!

      【讨论】:

        【解决方案5】:

        就我而言,这只是我发送的请求(POST)不正确。我交叉检查了我的字段并注意到存在不匹配,服务器期望得到错误->在字符 0 处输入的结尾...

        【讨论】:

          【解决方案6】:

          可能没有意义,但除了添加内容类型标头外,没有其他方法对我有用

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

          【讨论】:

          • 我已经为此苦苦挣扎了好几个小时!非常感谢你救了我的命!
          • mHeaders.put("Accept", "application/json") 解决了我的问题。
          猜你喜欢
          • 2014-08-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-17
          • 1970-01-01
          • 1970-01-01
          • 2018-07-23
          • 1970-01-01
          相关资源
          最近更新 更多