我有一个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));
我如何捕获它,以免它使应用程序崩溃?
提前致谢!
答案 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));
}
尝试添加此捕获