Android JSON解析报错:JSONObject无法转为JSONArray求助
解决Steam游戏新闻JSON解析的JSONException问题
嘿,我一眼就看出问题出在哪了——你把JSON的层级结构搞混啦!错误提示里明确说appnews是JSONObject却被当成JSONArray来解析,咱们先对照原始JSON结构捋清楚:
{
"appnews": {
"appid": 466560,
"newsitems": [ ... ], // 这才是你要遍历的新闻列表数组
"count": 57
}
}
你原来的代码直接把appnews当成数组来获取,但实际上它是一个包含newsitems数组的对象。另外还有个隐形小坑:你只创建了一个News对象,循环里一直给它赋值,最后newsList里的所有元素都会指向同一个对象,显示的全是最后一条新闻的数据。
下面是修正后的完整代码,我标了关键修改点:
@Override protected Void doInBackground(Void... arg0) { HttpHandler sh = new HttpHandler(); // Making a request to url and getting response String url = "http://api.steampowered.com/ISteamNews/GetNewsForApp/v0002/?appid=466560&count=3&maxlength=300&format=json"; String jsonStr = sh.makeServiceCall(url); if (jsonStr != null) { try { JSONObject jsonObj = new JSONObject(jsonStr); // 关键修改1:先获取appnews这个JSONObject,而非JSONArray JSONObject appNewsObj = jsonObj.getJSONObject("appnews"); // 关键修改2:从appnews对象中取出真正的新闻列表数组newsitems JSONArray newsItemsArray = appNewsObj.getJSONArray("newsitems"); for (int i = 0; i < newsItemsArray.length(); i++) { JSONObject newsItem = newsItemsArray.getJSONObject(i); // 关键修改3:每次循环新建News实例,避免数据覆盖 News news = new News(); news.setTittle(newsItem.getString("title")); // 注意JSON字段是contents,不是content! news.setContent(newsItem.getString("contents")); news.setDate(newsItem.getString("date")); news.setFeed(newsItem.getString("feedlabel")); news.setUrl(newsItem.getString("url")); newsList.add(news); } } catch (final JSONException e) { runOnUiThread(new Runnable() { @Override public void run() { // 新增异常提示,方便调试 Toast.makeText(getApplicationContext(), "解析新闻数据失败: " + e.getMessage(), Toast.LENGTH_LONG).show(); } }); e.printStackTrace(); // 打印异常栈,快速定位问题 } } else { runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "Couldn't get json from server", Toast.LENGTH_LONG).show(); } }); } return null; }
核心修改说明:
- JSON层级修正:先获取
appnews对象,再从中提取newsitems数组,直接解决了你遇到的JSONException - 对象复用问题:循环内每次新建
News实例,确保每条新闻都是独立对象,不会出现后续数据覆盖之前的情况 - 字段名修正:你原来用的
content字段名有误,JSON里实际是contents,这个小细节也会导致解析失败
内容的提问来源于stack exchange,提问作者Samed Sen
相关产品推荐
相关产品推荐

