如何遍历JSON数组并将数据保存至ArrayList?代码异常排查
问题分析与解决:JSON数组遍历后列表数据丢失
你遇到的问题根源在于不必要的中间列表操作,以及对列表赋值逻辑的误解,导致你误以为数据丢失。咱们一步步拆解问题,再给出最简解决方案:
错误原因拆解
你原来的代码里有两个关键问题:
- 每次循环覆盖中间列表:
al = Arrays.asList(nameString);这一行会在每次循环时,把al重新赋值为一个仅包含当前名字的固定大小列表,之前的元素完全被覆盖——但其实你根本不需要这个中间列表。 - 冗余的遍历操作:遍历这个只有一个元素的
al再添加到al2,完全是多此一举,直接把nameString加到al2就可以完成需求。
另外,你的代码还缺少必要的空安全判断,很容易触发空指针异常,比如当response里没有information字段时,firstObject会是null,调用getJSONArray直接报错。
修正后的代码
直接简化逻辑,去掉冗余步骤,同时增加空安全处理:
JSONObject firstObject = response.optJSONObject("information"); List<String> nameList = new ArrayList<>(); // 先判断firstObject是否存在,避免空指针 if (firstObject != null) { JSONArray infoArray = firstObject.getJSONArray("info"); for (int index = 0; index < infoArray.length(); index++) { JSONObject jsonObject = infoArray.getJSONObject(index); // 用optString代替getString,避免"name"字段不存在时抛出异常 String name = jsonObject.optString("name"); System.out.println("name: " + name); log.info("nameString " + name); // 直接将名字添加到目标列表 if (!name.trim().isEmpty()) { // 可选:过滤空的或纯空格的名字 nameList.add(name); } } } // 循环结束后,nameList中就保存了所有有效的名字
额外优化建议
- 优先使用
optXXX系列方法(比如optJSONObject、optString)代替getXXX,这样当字段不存在时会返回默认值(null或空字符串),而不是直接抛出异常,让代码更健壮。 - 避免创建不必要的中间变量(比如你原来的
save、al),简化代码逻辑,减少出错概率。
内容的提问来源于stack exchange,提问作者spring_hiber
相关产品推荐
相关产品推荐

