2011-11-01 4 views
1

내 응용 프로그램에는 RESTful Python 백엔드 서버에서 HTTP 요청을 통해 Android 장치로 JSON을 보내는 작업이 포함됩니다. 그러나, 나는 계속 JsonParseException을 얻는다. 여기에 어떻게 JSON 생성 및 반환되는 경우 : JSON은 다음과 같습니다Python에서 JSON 만들기 및 Java 구문 분석

articleList = [] 
obj = Content.objects.filter(id = 332).values()[0] 
articleList.append(obj)  
data = {'articleList' : articleList}   
return simplejson.dumps(data) 

을 :

{\"articleList\": 
    [ 
     {\"ArticleName\": \"Test_ArticleName\\n\", \"ArticleText\":\"Test_ArticleText\" 
     ,\"Author\": \"Test_Author\\n\", \"SourceID\": 18, \"Image\": \"NULL\", \"ImageLink\": \"NULL\", \"Video\": \"NULL\", \"PublicationDate\": \"8/15/2011 4:00AM\", \"VideoLink\": \"NULL\\n\", \"NumViews\": 0, \"Type\": \"NULL\", \"id\": 332} 
    ] 
} 

내가 복사 자바에이 문자열을 붙여 작동 그래서 문제를 생각하지 않는다 구조와 관련이있다.

클라이언트에

내가 JSON 구문 분석 GSON 라이브러리를 사용하고 있습니다 :

ArticleList articleList; 
InputStream source = retrieveStream(urlStr); 
Gson gson = new GsonBuilder().setVersion(1.0).create(); 
String json = convertStreamToString(source); 
try { 
    json = URLDecoder.decode(json,"UTF-8"); 
    articleList = gson.fromJson(json, ArticleList.class); 
} catch (UnsupportedEncodingException e1) { 
    Log.e(TAG,"Decoding error: "+e1); 
} catch (JsonParseException e) { 
    Log.e(TAG, "Parsing error: "+e); 
} 

private static String convertStreamToString(InputStream is) { 

    BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
    StringBuilder sb = new StringBuilder(); 

    String line = null; 
    try { 
     while ((line = reader.readLine()) != null) { 
      sb.append(line); 
     } 
     Log.i(TAG, sb.toString()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      is.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    return sb.toString(); 
} 

내 ArticleList.class 그냥

List<Article> articleList 

를 포함하고 내 Article.class이 모든 열쇠 "ArticleName"를 포함을 "ArticleText", 등등 내가 무엇입니까

는 예외입니다 :

Parsing error: com.google.gson.JsonParseException: Expecting object found: "{\"articleList\": [{\"ArticleName\": \"Test_ArticleName\\n\", \"ArticleText\": \"Test_ArticleText\", \"Author\": \"Test_Author\\n\", \"SourceID\": 18, \"Image\": \"NULL\", \"ImageLink\": \"NULL\", \"Video\": \"NULL\", \"PublicationDate\": \"8/15/2011 4:00AM\", \"VideoLink\": \"NULL\\n\", \"NumViews\": 0, \"Type\": \"NULL\", \"id\": 332} 

나는 이스케이프 처리되지 않은 이스케이프 때문에이 예외가 발생할 수 있다고 생각하지만 어떻게 처리해야할지 모르겠다. ArticleList 객체로 변환하기 전에 JSON을 디코딩 해봤습니다.

+0

음을, 음 ... 그래, 그건 :이 따옴표는 가 외부 자원 (Stream에, 문서 또는 유사한)에서 JSON을 읽기 및 JSON 따라서 읽어야 할 때, 이스케이프하지 hoever한다 유효하지 않은 JSON입니다. 모든 백 슬래시를 볼 수 있습니까? 뿐만 아니라 줄 바꿈과 함께 줄 바꿈을 연결 한 다음 올바른 JSON이 될 것으로 기대합니다. 그러면 JSON은 유효하지 않습니다. –

+0

큰 따옴표는 파이썬에서 이스케이프 처리되었지만 URL.decoder가 트릭을 수행하지 않았으므로 탈출 방법을 잘 모르겠습니다. – slouie

+0

"NULL"값이 실제로 Java에서 Null로 처리된다고 생각합니까? – Lachezar

답변

2

제공된 JSON 문자열을 Java 프로그램의 String으로 붙여 넣는 작업은 인용 부호 (String Notation Termination 문자로 작동)가 이스케이프된다는 사실 때문에 효과적입니다.

{"articleList": 
    [ 
     {"ArticleName": "Test_ArticleName\n", "ArticleText":"Test_ArticleText" 
     ,"Author": "Test_Author\n", "SourceID": 18, "Image": "NULL", "ImageLink": "NULL", "Video": "NULL", "PublicationDate": "8/15/2011 4:00AM", "VideoLink": "NULL\n", "NumViews": 0, "Type": "NULL", "id": 332} 
    ] 
} 
+0

답장을 보내 주셔서 감사합니다! 나는 HttpResponse (json.dumps (data), mimetype = "application/json")를 반환하는 파이썬 코드의 리턴을 변경함으로써 이슈를 수정했다. – slouie