响应齐射JSON异常

pod7payv  于 2023-03-24  发布在  其他
关注(0)|答案(2)|浏览(156)

我有一个VolleyJSONRequest被卡住了,因为来自服务器的响应不是有效的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

整个应用程序就会崩溃
我设法跟踪到www.example.com类中的以下行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));
    }
}

被调用的线路是:返回响应错误(新的解析错误(je));
我该如何捕捉它,这样它就不会崩溃的应用程序?
先谢了!

dnph8jn4

dnph8jn41#

如果您希望获取JSON,请检查您的URL是否有效。请求无效时通常会返回HTML。例如请求返回 404 not found 网页。
如果你想获取HTML(或XML),可以使用StringRequest获取String,然后将其转换为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);
                            }
                        }));
3vpjnl9f

3vpjnl9f2#

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

尝试添加此捕获

相关问题