You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

核心修改说明:

  1. JSON层级修正:先获取appnews对象,再从中提取newsitems数组,直接解决了你遇到的JSONException
  2. 对象复用问题:循环内每次新建News实例,确保每条新闻都是独立对象,不会出现后续数据覆盖之前的情况
  3. 字段名修正:你原来用的content字段名有误,JSON里实际是contents,这个小细节也会导致解析失败

内容的提问来源于stack exchange,提问作者Samed Sen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:37:14