Ошибка синтаксического анализа JSON, данные не отображаются
Я только начинаю изучать, как использовать JSON в Android. Я должен сделать приложение, которое отображает заголовок, раздел и автора новостей.
Я не совсем уверен, что проблема в синтаксическом анализе или что-то еще, но он постоянно говорит мне, что нет данных.
Так что могу ли я получить помощь по этой части, если у нее есть проблема, чтобы я мог ее исправить или пойти посмотреть, где проблема.
код JSON:
{
"response": {
"status": "ok",
"userTier": "developer",
"total": 191,
"startIndex": 1,
"pageSize": 10,
"currentPage": 1,
"pages": 20,
"orderBy": "relevance",
"results": [{
"id": "film/2017/may/25/12-jours-review-raymond-depardon-documentary-psychiatric-hospital-judge",
"type": "article",
"sectionId": "film",
"sectionName": "Film",
"webPublicationDate": "2017-05-25T15:37:15Z",
"webTitle": "12 Jours review – a devastating glimpse into broken souls",
"webUrl": "https://www.theguardian.com/film/2017/may/25/12-jours-review-raymond-depardon-documentary-psychiatric-hospital-judge",
"apiUrl": "https://content.guardianapis.com/film/2017/may/25/12-jours-review-raymond-depardon-documentary-psychiatric-hospital-judge",
"fields": {
"headline": "12 Jours review – a devastating glimpse into broken souls",
"starRating": "4",
"shortUrl": "https://gu.com/p/6g6hn",
"thumbnail": "https://media.guim.co.uk/1dbf594e183ebe5428fe88c82784c55908b4753c/0_0_3598_2160/500.jpg"
},
"tags": [{
"id": "profile/wendy-ide",
"type": "contributor",
"sectionId": "film",
"sectionName": "Film",
"webTitle": "Wendy Ide",
"webUrl": "https://www.theguardian.com/profile/wendy-ide",
"apiUrl": "https://content.guardianapis.com/profile/wendy-ide",
"references": [],
"firstName": "wendy",
"lastName": "ide"
}],
"isHosted": false,
"pillarId": "pillar/arts",
"pillarName": "Arts"
}]
}
}
все что мне нужно это title
, section
, author
и url
, Итак, я написал это так:
private static List<News> extractFeatureFromJson(String newsJSON) {
if (TextUtils.isEmpty(newsJSON)) {
return null;
}
List<News> news = new ArrayList<>();
try {
JSONObject baseJsonResponse = new JSONObject(newsJSON);
String response = baseJsonResponse.getString("response");
JSONObject object = new JSONObject(response);;
JSONArray newsArray=object.getJSONArray("results");
for (int i = 0; i < newsArray.length(); i++) {
JSONObject currentNews = newsArray.getJSONObject(i);
JSONObject results = currentNews.getJSONObject("results");
String title = results.getString("webTitle");
String section = results.getString("sectionName");
String author = results.getString("firstName");
String url = results.getString("webUrl");
News nNews = new News(title, section, author, url);
news.add(nNews);
}
} catch (JSONException e) {
Log.e("QueryUtils", "Problem parsing the news JSON results", e);
}
return news;
}
Это новая концепция для меня, и я очень смущен, я был бы очень признателен за помощь.
Редактировать:
Я использую загрузчик в том же приложении, если список пуст, он будет отображать строку, в которой нет данных, и это то, что он продолжает появляться. Я понятия не имею, в чем проблема.
public void onLoadFinished(Loader<List<News>> loader, List<News> news) {
View loadingIndicator = findViewById(R.id.loading_indicator);
loadingIndicator.setVisibility(View.GONE);
emptyTextView.setText(R.string.no_news);
newsAdapter.clear();
if (news != null && !news.isEmpty()) {
newsAdapter.addAll(news);
}
}
7 ответов
Используйте этот код для extractFeatureFromJson
private static List<News> extractFeatureFromJson(String newsJSON) {
if (TextUtils.isEmpty(newsJSON)) {
return null;
}
List<News> news = new ArrayList<>();
try {
JSONObject baseJsonResponse = new JSONObject(newsJSON);
String response = baseJsonResponse.getString("response");
JSONObject object = new JSONObject(response);;
JSONArray newsArray=object.getJSONArray("results");
for (int i = 0; i < newsArray.length(); i++) {
JSONObject currentNews = newsArray.getJSONObject(i);
String title = currentNews.getString("webTitle");
String section = currentNews.getString("sectionName");
JSONArray tag = currentNews.getJSONArray("tags");
String firstName;
if(tag.length() != 0){
firstName = tag.getJSONObject(0).getString("firstName");
}
String url = currentNews.getString("webUrl");
News nNews = new News(title, section, author, url);
news.add(nNews);
}
} catch (JSONException e) {
Log.e("QueryUtils", "Problem parsing the news JSON results", e);
}
return news;
}
Вы не должны использовать JSONObject results = currentNews.getJSONObject("results");
потому что вы уже получили массив результатов как JSONArray newsArray=object.getJSONArray("results");
попробуй это
for (int i = 0; i < newsArray.length(); i++) {
JSONObject results = newsArray.getJSONObject(i);
String title = results.getString("webTitle");
String section = results.getString("sectionName");
String author = results.getString("firstName");
String url = results.getString("webUrl");
News nNews = new News(title, section, author, url);
news.add(nNews);
}
Удалить эту строку
String response = baseJsonResponse.getString("response");
И изменить эту строку
JSONObject object = new JSONObject(response);
к
JSONObject object = baseJsonResponse.getJSONObject("response");
Замените этот цикл в вашем коде, все остальное вроде бы нормально.
private static List<News> extractFeatureFromJson(String newsJSON) {
if (TextUtils.isEmpty(newsJSON)) {
return null;
}
List<News> news = new ArrayList<>();
try {
JSONObject baseJsonResponse = new JSONObject(newsJSON);
String response = baseJsonResponse.getString("response");
JSONObject object = new JSONObject(response);;
String status = object.getString("status");
if(status.equals("ok")){
JSONArray newsArray=object.getJSONArray("results");
for (int i = 0; i < newsArray.length(); i++) {
JSONObject currentNews = newsArray.getJSONObject(i);
JSONObject results = currentNews.getJSONObject("results");
String title = results.getString("webTitle");
String section = results.getString("sectionName");
String author = results.getString("firstName");
String url = results.getString("webUrl");
News nNews = new News(title, section, author, url);
news.add(nNews);
}
}else{
//Invalid response Toast here
}
} catch (JSONException e) {
Log.e("QueryUtils", "Problem parsing the news JSON results", e);
}
return news;
}
Попробуйте этот код,
JSONObject baseJsonResponse = new JSONObject(newsJSON);
JSONObject resJson =baseJsonResponse.getJSONObject("response");
String status = resJson.getString("status");
JSONArray newsArray=resJson .getJSONArray("results");
try
{
JSONObject jsonObject = new JSONObject("Your_json");
// get response object
JSONObject jsonObjectResponse = jsonObject.getJSONObject("response");
/*
get Status string from jsonObjectResponse
you can also get | userTier | total | startIndex and other strings in this json Object
*/
String status = jsonObjectResponse.getString("status");
// get result as Json array from jsonObjectResponse
JSONArray jsonArrayResults = jsonObjectResponse.getJSONArray("results");
for (int i = 0; i < jsonArrayResults.length() ; i++)
{
JSONObject jsonObjectResult = jsonArrayResults.getJSONObject(i);
String id = jsonObjectResult.getString("id");
String type = jsonObjectResult.getString("type");
String sectionId = jsonObjectResult.getString("sectionId");
String sectionName = jsonObjectResult.getString("sectionName");
String webPublicationDate = jsonObjectResult.getString("webPublicationDate");
String webTitle = jsonObjectResult.getString("webTitle");
String webUrl = jsonObjectResult.getString("webUrl");
String apiUrl = jsonObjectResult.getString("apiUrl");
JSONObject jsonObjectfields = new JSONObject(jsonObjectResult.getString("fields"));
String fieldHeadLine = jsonObjectfields.getString("headline");
String fieldStarRating = jsonObjectfields.getString("starRating");
String fieldShortUrl = jsonObjectfields.getString("shortUrl");
String fieldThumbnail = jsonObjectfields.getString("thumbnail");
JSONArray jsonArrayTags = jsonObjectResult.getJSONArray("tags");
for (int j = 0; j < jsonArrayTags.length(); j++)
{
JSONObject jsonObjectTags = jsonArrayTags.getJSONObject(j);
String tagID = jsonObjectTags.getString("id");
String tagType = jsonObjectTags.getString("type");
String tagSelectionID = jsonObjectTags.getString("sectionId");
String tagSectionName = jsonObjectTags.getString("sectionName");
// iam just get 4 string ! you can get all tags string with replacing
}
//** and get others each jsonObject from result Array
}
}
catch (JSONException e)
{
e.printStackTrace();
// when parse json error happend! check log cat
}
этот код разобрать эту ссылку
Я взял только несколько предметов из каждой части, чтобы прояснить дело