Android JSON解析无数据显示,请求技术排查协助
问题排查与修复方案
你的APP提示无数据,核心问题出在JSON解析逻辑的多处错误,导致解析过程抛出异常,最终返回空的新闻列表。下面我们逐一拆解问题并给出修复代码:
解析代码中的关键错误
- 错误处理
response字段
原JSON里的response本身就是一个JSONObject,但你却把它当作String取出后再重新转为JSONObject——这不仅多余,还可能在某些场景下触发解析错误。 - 循环中错误获取新闻对象
你已经从results数组中取出了currentNews(这就是单条新闻的对象),但又试图从currentNews里再获取results对象,而原JSON里单条新闻根本没有results这个key,这会直接抛出JSONException,导致整个解析流程中断。 - 作者信息的获取路径错误
作者的firstName并不在新闻对象的根节点,而是嵌套在tags数组中type为contributor的对象里,你直接从新闻对象取firstName必然失败。
修复后的解析代码
private static List<News> extractFeatureFromJson(String newsJSON) { if (TextUtils.isEmpty(newsJSON)) { return null; } List<News> news = new ArrayList<>(); try { JSONObject baseJsonResponse = new JSONObject(newsJSON); // 直接获取response JSONObject,不需要转String再转JSON JSONObject responseObject = baseJsonResponse.getJSONObject("response"); JSONArray newsArray = responseObject.getJSONArray("results"); for (int i = 0; i < newsArray.length(); i++) { JSONObject currentNews = newsArray.getJSONObject(i); // 直接从currentNews获取新闻核心字段 String title = currentNews.getString("webTitle"); String section = currentNews.getString("sectionName"); String url = currentNews.getString("webUrl"); String author = ""; // 处理作者信息:遍历tags数组找到贡献者 JSONArray tagsArray = currentNews.getJSONArray("tags"); for (int j = 0; j < tagsArray.length(); j++) { JSONObject tag = tagsArray.getJSONObject(j); if ("contributor".equals(tag.getString("type"))) { String firstName = tag.optString("firstName", ""); String lastName = tag.optString("lastName", ""); author = firstName + " " + lastName; // 找到第一个贡献者后即可退出循环 break; } } News nNews = new News(title, section, author.trim(), url); news.add(nNews); } } catch (JSONException e) { Log.e("QueryUtils", "Problem parsing the news JSON results", e); } return news; }
额外说明
- 我用了
optString来获取作者名,避免因为字段缺失导致解析失败; - 作者名拼接后做了
trim()处理,防止空字符串出现多余空格; - 你的Loader代码本身没有问题,但因为解析过程抛出异常,
news会是空列表,所以才会显示no_news。修复解析逻辑后,就能正常加载数据了。
内容的提问来源于stack exchange,提问作者NA- Chan
相关产品推荐
相关产品推荐

