当前位置: 首页 > 知识库问答 >
问题:

响应凌空JSONException

穆子琪
2023-03-14

我有一个凌空的JSONRequest,它被卡住了,因为来自服务器的响应不是有效的JSON(它是html)。

如何才能优雅地处理此错误?我有以下实现:

JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {

        @Override
        public void onResponse(JSONObject response) {
            … something …   
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
        // TODO Auto-generated method stub
            Log.i(TAG,"error "+error.toString());
        }
    });
    queue.add(jsObjRequest);

然而,当我发送请求并得到无效的JSON响应时,不会调用onErrorResponse。相反,我得到了一个例外

08-14 16:26:15.590: D/538 - JsonRequest(27888): exception error Value <!DOCTYPE of type java.lang.String cannot be converted to JSONObject

整个应用程序崩溃了。

我设法将该错误跟踪到JsonObjectRequest.java类中的以下行:

 @Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
    try {

        Log.d(TAG,"response headers "+response.headers.toString());
        String jsonString =
            new String(response.data, HttpHeaderParser.parseCharset(response.headers));
        Log.d(TAG,"json string "+jsonString);
        return Response.success(new JSONObject(jsonString),
                HttpHeaderParser.parseCacheHeaders(response));
    } catch (UnsupportedEncodingException e) {
        Log.d(TAG,"parse error");
        return Response.error(new ParseError(e));
    } catch (JSONException je) {
        Log.d(TAG,"exception error "+je.getLocalizedMessage());
        return Response.error(new ParseError(je));
    }
}

调用的行是:返回响应。错误(new ParseError(je));

我如何抓住它,这样它就不会崩溃的应用程序?

提前感谢!

共有2个答案

田普松
2023-03-14
} catch (JSONException je) {
    Log.v("Volley", "JSONException " + response.statusCode);
    if (response.statusCode == 200)// Added for 200 response
        return Response.success(new JSONObject(),HttpHeaderParser.parseCacheHeaders(response));
    else
        return Response.error(new ParseError(je));
}

尝试添加此捕获

朱伯寅
2023-03-14

如果您希望获得JSON,那么应该检查URL是否有效。当请求无效时,通常返回HTML。例如,当请求返回404 not found网页时。

如果您试图获取HTML(或XML),可以使用StringRequest获取字符串,然后将其转换为XML文档,也可以使用SAXParser对其进行解析。例如:

StringRequest request = new StringRequest(Method.GET, url, new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        try {
            Document xml = factory.newDocumentBuilder().parse(response);
            //TODO: handle XML Document parsing
        } catch (Throwable t) {
            return ;
        }
    }
}, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            // TODO Auto-generated method stub

        }

});

queue.add(request);

作为一种更简单的选择,您可能希望考虑的一件事是droidQuery。要使用droidQuery完成此请求,请执行以下操作:

$.ajax(new AjaxOptions().url(url)
                        .type("GET")
                        .dataType("XML")
                        //optionally, add own SAX parser with SAXContentHandler or customXMLParser methods
                        .success(new Function() {
                            @Override
                            public void invoke($ droidQuery, Object... params) {
                                Document xml = (Document) params[0];
                                //TODO: parse Document
                            }
                        })
                        .error(new Function() {
                            @Override
                            public void invoke($ droidQuery, Object... params) {
                                AjaxError error = (AjaxError) params[0];
                                Log.e("$", "Error " + error.status + ": " + error.error);
                            }
                        }));
 类似资料:
  • 我正在从服务器下载文件。我用排球来做。 这是我的代码 以下是错误侦听器的错误消息在一些弱网络连接上,我收到以下逻辑消息 我不明白失败的原因是什么,因为大多数错误消息都返回null。我很确定这是因为请求超时,我知道如何增加超时,但是我应该在错误侦听器中编写什么代码,以便在出现错误时获得正确的错误消息。

  • 我从互联网上搜索了很多来设置凌空的请求超时。我最终得到了重试策略的解决方案,但当研究它不设置超时时,它会设置请求的重试时间,但我不想重试我的请求。我想增加凌空请求超时,以便较慢的网络可以访问数据,凌空超时设置为5秒,这意味着如果网络直到5秒才连接,它将抛出超时异常。我如何管理更改时间以从服务器获取响应。 我的代码是 我有两个问题-- (1) 它会在30秒后重试请求吗? (2)如何设置请求超时30秒

  • 所以我想打印响应的结果,然后使用gson为模型生成数据,但响应永远不会得到返回,因为调用了onResponse。! 如果你注意到Logcat,日志。我的回答没有显示。。!?但是在使用该请求的活动的onSuccess中,它通常会显示日志,但是如果日志包含响应对象,它不会显示哪个非常奇怪,也没有任何意义。。!? Logcat公司 我尝试使用具有相同url和参数的PostMan测试请求,它通常返回jso

  • 我使用的是volley.jar,在编译时没有错误,但是有运行时异常。 然后添加volley.jar和build path。什么是问题? CustomAdapter.java

  • 问题内容: 我正在使用凌空特技从REST api解析电影详细信息,并将解析后的数据保存在一个名为detailsMovies的对象的Arraylist中。但是我无法在onResponse方法之外访问ArrayList。我是Android新手,所以我不知道该怎么做。任何帮助表示赞赏! 这是代码: 问题答案: 在您的课程中定义一个接口并实现它。 因此,这里的简单技巧是与回调接口。

  • 关于在项目中使用截击,我有几个问题: 这个库可以在任何Java项目中使用,还是仅在Android中使用