Android中org.json.JSONException报错求助:JSONArray转JSONObject失败
解决Android端JSONArray转JSONObject的报错问题
兄弟,我刚帮你捋清楚这个问题的根源了——你服务器返回的是JSON数组(哪怕是空数组[]),但Android代码里却硬要把它当成JSONObject来解析,这可不就报错嘛!Postman能正常显示是因为它能自动识别数组格式,但Android的JSON解析器对类型要求特别严格,类型不匹配直接就抛出异常了。
从你贴的PHP片段来看,findUsers方法执行查询后返回的是多条用户记录的集合,所以PHP端输出的是JSON数组,而不是单个JSONObject,这就和你Android端的解析逻辑冲突了。
具体解决方案
1. 立刻修正Android的解析逻辑
把原来解析JSONObject的代码改成用JSONArray处理,举个例子:
// 原来错误的写法(假设response是服务器返回的字符串) // JSONObject jsonObj = new JSONObject(response); // 改成正确的JSONArray解析方式 JSONArray userArray = new JSONArray(response); // 遍历数组处理每一条用户数据 for (int i = 0; i < userArray.length(); i++) { JSONObject userObj = userArray.getJSONObject(i); // 提取字段 String meno = userObj.getString("Meno"); String rodneCislo = userObj.getString("RodneCislo"); String pik = userObj.getString("PIK"); // 把数据添加到列表或者做后续处理 }
2. 确认PHP端返回标准的JSON数组
检查你PHP脚本的输出部分,确保是直接把查询到的数组用json_encode()输出,比如:
// 假设查询后通过fetch_assoc拿到每条记录 $userList = []; while ($row = $stmt->fetch_assoc()) { $userList[] = $row; } // 直接输出数组,空的时候就是[] echo json_encode($userList);
别额外把数组包裹成对象(比如echo json_encode(["data" => $userList])),除非你Android端也对应解析外层的JSONObject。
3. 搞清楚另一款应用为啥能跑通
你说另一款应用用相同方法没问题,大概率是那款应用的解析逻辑本来就是用JSONArray处理的,或者对应的PHP接口返回的是带外层对象的格式(比如把数组包在data字段里)。你可以对比两款应用的解析代码,或者两个PHP接口的返回格式,就能找到差异了。
额外小 tips
- 用Android的Log把服务器返回的完整response字符串打出来,一眼就能确认是不是JSON数组,排查问题更高效。
- 如果想统一接口格式(比如不管有没有数据都返回带状态的对象),可以修改PHP端返回这种结构:
echo json_encode([ "code" => 200, "msg" => "查询成功", "data" => $userList ]);
对应的Android解析就可以先拿外层JSONObject,再取里面的JSONArray:
JSONObject responseObj = new JSONObject(response); JSONArray userArray = responseObj.getJSONArray("data"); // 后续遍历数组即可
内容的提问来源于stack exchange,提问作者Coldnight
相关产品推荐
相关产品推荐

