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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:15:45