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

Android解析JSON至ListView无数据,报JSONObject转JSONArray错误

问题根源与解决方案

核心错误分析

你遇到的of type org.json.JSONObject cannot be converted to JSONArray错误,核心原因是服务端返回的JSON是外层对象包裹数组的结构,而你直接把整个响应当作JSONArray解析了。看服务端返回的数据:

{
  "orders": [
    // 订单数据数组
  ]
}

你的代码直接将dbResult转为JSONArray,但它本质是一个包含orders数组的JSONObject,类型不匹配自然报错。

另外还有两个隐藏问题:

  • 循环只执行1次(for (int i = 0; i < 1; i++)),只会加载第一个订单数据
  • 服务端字段是naam,但你代码里写的是jo.getString("name"),会导致取不到值甚至抛出异常

修正后的代码实现

1. 修复JSON解析逻辑

先解析外层JSONObject,再取出里面的orders数组,同时修正循环和字段名:

try {
    // 第一步:解析外层JSON对象
    JSONObject outerObj = new JSONObject(dbResult);
    // 第二步:取出orders数组
    JSONArray arr = outerObj.getJSONArray("orders");
    JSONObject jo = null;
    data = new String[arr.length()];
    
    // 第三步:遍历整个数组(修正循环条件)
    for (int i = 0; i < arr.length(); i++) {
        jo = arr.getJSONObject(i);
        // 注意服务端字段是naam,不是name
        data[i] = jo.getString("naam");
    }
    
    adapter = new ArrayAdapter<String>(this, R.layout.layout_list, R.id.list_item, data);
    listview.setAdapter(adapter);
} catch (Exception e) {
    e.printStackTrace();
}

2. 优化网络请求(可选但推荐)

你用StrictMode允许主线程网络请求的方式不规范,容易引发ANR(应用无响应)。建议改用异步回调处理网络结果,避免阻塞主线程:

// 替换MPWebservice方法中的网络请求部分
new AsyncTask<String, Void, String>() {
    @Override
    protected String doInBackground(String... urls) {
        try {
            dbConnect database = new dbConnect(MainActivity.this);
            return database.execute(urls[0]).get();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        if (result != null) {
            // 把JSON解析逻辑放在异步回调中执行
            try {
                JSONObject outerObj = new JSONObject(result);
                JSONArray arr = outerObj.getJSONArray("orders");
                data = new String[arr.length()];
                for (int i = 0; i < arr.length(); i++) {
                    JSONObject jo = arr.getJSONObject(i);
                    data[i] = jo.getString("naam");
                }
                adapter = new ArrayAdapter<String>(MainActivity.this, R.layout.layout_list, R.id.list_item, data);
                listview.setAdapter(adapter);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}.execute(con);

额外测试建议

  • 在解析前先打印dbResult,确认它和服务端返回的JSON完全一致,避免网络请求过程中出现乱码或截断
  • 检查dbConnect类的execute方法是否正确返回了完整的响应字符串

内容的提问来源于stack exchange,提问作者stefan de boer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:17:43