Мое приложение включает отправку JSON с серверного сервера RESTful Python на устройство Android через HTTP-запросы. Тем не менее, я продолжаю получать исключение JsonParseException. Вот как создается и возвращается JSON:
articleList = []
obj = Content.objects.filter(id = 332).values()[0]
articleList.append(obj)
data = {'articleList' : articleList}
return simplejson.dumps(data)
JSON выглядит так:
{\"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}
]
}
Когда я копирую и вставляю эту строку в Java, она работает, поэтому я не думаю, что проблема связана с этой структурой.
На клиенте я использую библиотеку GSON для анализа JSON:
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}
Я думаю, что, возможно, получаю это исключение из-за невыполненных кавычек, но я не уверен, как с этим бороться. Я даже пытался расшифровать JSON до преобразования в объект ArticleList.
Вставка строки JSON, которую вы предоставили в строку Java-программы, работает - из-за того, что кавычки (действующие как символы окончания записи строк) экранированы. Эти кавычки не должны hoever быть экранированы, при чтении JSON от внешнего ресурса (в потоке, документ или аналогичный), и JSON должен поэтому следующим образом:
{"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}
]
}