响应Volley JSONException

时间:2013-08-14 14:35:41

标签: android json request android-volley

我有一个Volley 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));
    }
}

被调用的行是:返回Response.error(new ParseError(je));

我如何捕获它,以免它使应用程序崩溃?

提前致谢!

2 个答案:

答案 0 :(得分:1)

如果您希望获得JSON ,则应检查您的网址是否有效。当请求无效时,通常会返回HTML。这样的示例是当请求返回 404未找到网页时。

如果您尝试获取HTML(或XML),可以使用StringRequest获取字符串,然后将其转换为XML Document或者可以使用一个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);
                            }
                        }));

答案 1 :(得分:0)

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

尝试添加此捕获