2013-08-14 2 views
0

서버로부터의 응답이 유효한 JSON (html)이 아니기 때문에 멈출 수있는 Volley JSONRequest가 있습니다.Volley에 응답 JSONException

이 오류를 정상적으로 처리하는 방법은 무엇입니까? 내가 요청을 전송하고 유효하지 않은 JSON 응답을 얻을 때 그러나, onErrorResponse가 호출되지 않습니다

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

:이 구현이있다. 대신 예외가 발생합니다.

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 (새 ParseError (JE));

어떻게 잡아서 앱을 중단시키지 않습니까? 사전에

감사합니다!

답변

1

당신이 JSON을 얻을 것으로 기대하는 경우, 당신은 당신의 URL이 유효한지 확인해야합니다. 요청이 유효하지 않은 경우 HTML이 반환되는 경우가 많습니다. 이러한 예는 요청이 404를 찾지 못했을 때입니다. 웹 페이지. 당신이 HTML (또는 XML)를 얻으려고 노력하는 경우

, 당신은 다음 XML Document로 변환, 문자열을 얻을 수있는 StringRequest를 사용하거나 구문 분석하는 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 같이 고려해야 할 수도 있습니다

한 가지.

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

보십시오이 캐치

를 추가 : droidQuery로이 요청을 완료하려면
관련 문제