Android ListView点击项后详情页空白,JSON转换异常求助
嘿,这个问题我之前也踩过坑,咱们一步步拆解来看:
首先得明确这个异常的核心:你尝试把字符串值"No"当作JSONArray来解析,触发了类型不匹配的错误。这也是详情页为空的直接原因——解析失败后,后续加载数据的逻辑直接中断了。
可能的原因&排查步骤
跳转时传递的数据有误
先检查ListView的Item点击事件代码:你应该是通过Intent把数据传给activity_details的吧?打印一下传递的参数值,看看是不是把字符串"No"当成了JSON数组格式的字符串来传递。比如可能列表项中某个字段为空时,你给它赋值了"No",然后直接把这个值传到详情页去解析成JSONArray,自然就报错了。接口返回的数据格式不符合预期
如果详情页是从后端接口获取数据,那去看看接口返回的响应体:原本你预期某个字段是JSON数组(比如{"attributes": []}),但当没有数据时,后端返回的是字符串"No"(比如{"attributes": "No"})。这时候你用new JSONArray(response.getString("attributes"))就会直接抛出这个异常。
对应的解决方案
如果是接口返回的问题
两种处理方式:- 和后端同学沟通,让他们统一返回JSON数组类型——即使没有数据,也返回空数组
[],保持数据格式的一致性; - 在客户端做兼容处理,先判断字段的类型和值,再决定怎么解析:
String attrStr = response.getString("attributes"); JSONArray attrArray; if ("No".equals(attrStr)) { // 没有数据时创建空数组 attrArray = new JSONArray(); } else { attrArray = new JSONArray(attrStr); }
- 和后端同学沟通,让他们统一返回JSON数组类型——即使没有数据,也返回空数组
如果是跳转传递数据的问题
修改ListView点击事件里的逻辑:确保传递给详情页的是合法的JSON数组格式字符串,而不是"No"。比如如果列表项没有对应数据,就传递一个空数组的字符串"[]",而不是"No"。进阶优化:换用更友好的JSON解析库
建议试试Gson或者Moshi这类第三方解析库,它们能通过注解轻松处理类型兼容的问题,比如指定默认值,避免手动解析JSON时容易出现的这类低级错误。
内容的提问来源于stack exchange,提问作者Natlus

