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
相关产品推荐
相关产品推荐

