Java解析JSON时JSONArray[5]找不到问题排查求助
嘿,我来帮你搞定这个JSON解析的问题!咱们一步步来排查:
排查JSONArray解析错误的问题
1. 先揪出代码里的第一个明显错误
你提供的JSON里,results是个二维数组,但它里面只有1个子数组(数组索引从0开始哦)。但你的代码里写的是results.get(1)——这直接就会触发数组索引越界的错误,因为results根本没有索引1的元素!
先明确你的JSON结构:
"results": [ [ "2C30AE32-191@Local", "Imperva Inc.", "SecureSphere", "Custom Violation", 1, "", ... ] ]
这里results的长度是1,只能用results.get(0)才能拿到里面的子数组。
2. 关于你遇到的JSONArray[5] not found错误
如果错误提示是索引5不存在,那得从两个方向查:
- 实际JSON的子数组长度:你贴出来的子数组有19个元素,索引5的位置是空字符串
"",是存在的。但如果你的真实响应里这个子数组长度不够6(也就是最多到索引4),那肯定会报这个错。建议你打印出完整的output字符串,确认子数组的实际元素数量。 - 代码里的索引是否写错:比如你是不是误写了
first.get(5)?或者有没有在其他地方访问了子数组的索引5,但那个位置的元素其实不存在?
3. 修正后的代码参考
我给你改了最基础的错误,还加了安全判断,避免再踩索引越界的坑:
String output = response.getEntity(String.class); JSONObject obj = new JSONObject(output); JSONArray results = obj.getJSONArray("results"); // 先判断results数组有没有元素 if (results.length() > 0) { // 用getJSONArray更规范,不用强制转换 JSONArray first = results.getJSONArray(0); // 取值前先检查子数组长度够不够,避免报错 if (first.length() >= 6) { // 看你要的deviceVendor应该是第二个元素,索引是1 String deviceVendor = first.getString(1); // deviceProduct是第三个元素,索引2 String deviceProduct = first.getString(2); // 索引5的空字符串 String emptyField = first.getString(5); // ... 其他你需要的操作 } else { System.err.println("子数组元素不够,拿不到索引5的内容"); } } else { System.err.println("results数组是空的哦"); }
4. 给你几个小建议
- 解析JSON时,一定要先判断数组长度,别直接硬写索引取值,很容易踩坑。
- 尽量用JSON库提供的类型安全方法,比如
getJSONArray()、getString()这些,比强制转换靠谱多了。 - 如果不确定JSON结构,先把完整的响应字符串打印出来,确认结构和元素数量和你想的一致——有时候响应可能会有截断或者格式变化,你肉眼看到的和实际拿到的可能不一样。
内容的提问来源于stack exchange,提问作者Think Smart
相关产品推荐
相关产品推荐

