如何用迭代器遍历JSON数组并正确组合对象字段(修正代码问题)
这个问题其实是迭代器使用的经典误区——你每次调用iterator.next()都会让迭代器直接跳到下一个元素,所以在同一循环里连续调用两次,相当于第一次拿第一个对象的Name,第二次直接跳到第二个对象拿Weight,不仅拿不到同一个对象的两个字段,还会导致循环次数减半,甚至最后抛出NoSuchElementException。
修正的思路很简单:先把当前迭代到的对象一次性取出来存到变量里,再从这个变量里获取需要的字段,这样就不会让迭代器意外前进了。
修正后的完整代码
JSONArray jsonarray = (JSONArray) parser.parse(string); // 建议指定泛型为String,提升类型安全性 List<String> list = new ArrayList<>(); Iterator<JSONObject> iterator = jsonarray.iterator(); while (iterator.hasNext()) { // 只调用一次next(),获取当前的JSON对象 JSONObject currentObj = iterator.next(); // 从同一个对象中读取Name和Weight并拼接 String combinedStr = currentObj.get("Name") + "/" + currentObj.get("Weight"); list.add(combinedStr); }
进阶优化(Java 8+)
如果你的项目使用Java 8及以上版本,还可以用Stream API简化代码,避免手动处理迭代器,代码会更简洁易读:
import java.util.stream.Collectors; // ... JSONArray jsonarray = (JSONArray) parser.parse(string); List<String> list = jsonarray.stream() // 将流中的元素转换为JSONObject类型 .map(item -> (JSONObject) item) // 拼接Name和Weight字段 .map(item -> item.get("Name") + "/" + item.get("Weight")) // 收集为List .collect(Collectors.toList());
这样就能得到你预期的["name1/3","name2/2"]结果啦。
内容的提问来源于stack exchange,提问作者Diego Retaggi
相关产品推荐
相关产品推荐

