我刚刚开始学习如何在Android中使用JSON。 我应该制作一个显示新闻标题,部分和作者的应用程序。
我不确定问题是在解析还是别的什么,但它一直告诉我没有数据。
如果这部分有问题,我可以得到一些帮助,这样我就可以修复它或者更多地了解问题所在。
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);
}
}
答案 0 :(得分:0)
删除此行
String response = baseJsonResponse.getString("response");
并更改此行
JSONObject object = new JSONObject(response);
要
JSONObject object = baseJsonResponse.getJSONObject("response");
答案 1 :(得分:0)
试试这段代码,
JSONObject baseJsonResponse = new JSONObject(newsJSON);
JSONObject resJson =baseJsonResponse.getJSONObject("response");
String status = resJson.getString("status");
JSONArray newsArray=resJson .getJSONArray("results");
答案 2 :(得分:0)
在你的代码中替换这个循环,其他一切似乎没问题。
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;
}
答案 3 :(得分:0)
你的Json类型错了!括号不匹配
答案 4 :(得分:0)
将此代码用于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;
}
答案 5 :(得分:0)
您不应该使用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);
}
答案 6 :(得分:0)
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
}
此代码解析this link
我从每个部分只拿了几个项目来澄清案例