使用Jackson读取含嵌套数组的JSON:遍历数组元素问题
解决Java中遍历JSON嵌套数组的空指针/数组越界问题
嘿,我完全懂你遇到的麻烦——你现在硬编码访问p.getCars()[2],但每个人的车辆数量不一样,有的只有1辆、2辆,这直接导致了数组越界(如果cars数组存在但长度不够)或者空指针(如果某个Person的cars字段为null)。要展示所有车辆,你需要嵌套循环,先遍历每个Person,再遍历该Person下的所有车辆,同时还要做非空判断来避免异常。
问题根源分析
你的代码里p.getCars()[2]是硬编码索引,这只对恰好有3辆车的用户有效。对于只有2辆车的用户(比如Leanne Graham),这个索引超出了数组长度,会抛出ArrayIndexOutOfBoundsException;如果某个Person的cars字段是null(比如JSON里没这个字段),还会抛出NullPointerException。
修改后的完整代码
try { ObjectMapper mapper = new ObjectMapper(); InputStream inputStream = new FileInputStream(new File("/Users/blah/Downloads/persons.json")); TypeReference<List<Person>> typeReference = new TypeReference<List<Person>>() {}; List<Person> persons = mapper.readValue(inputStream, typeReference); for (Person p : persons) { // 先打印用户基本信息 System.out.printf("Name: %s, City: %s%n", p.getFirstName(), p.getAddress().getCity()); // 处理车辆列表:先判断是否为null,避免空指针 String[] cars = p.getCars(); if (cars != null && cars.length > 0) { System.out.println("Cars available:"); // 遍历所有车辆 for (String car : cars) { System.out.println("- " + car); } } else { System.out.println("Cars available: None"); } System.out.println("---"); // 分隔每个用户的信息,更清晰 } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (JsonParseException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
关键改进点
- 嵌套循环遍历车辆:用
for (String car : cars)替代硬编码索引,确保不管有多少辆车都能全部输出 - 非空判断:先检查
cars != null,再判断长度,避免空指针和空数组的情况 - 更清晰的输出格式:把用户信息和车辆列表分开打印,可读性更强
可选的单行输出方式
如果你想保持类似原来的单行输出格式,可以用String.join()把车辆列表拼接成字符串:
if (cars != null && cars.length > 0) { String carList = String.join(", ", cars); System.out.printf("name is %s city is %s cars available %s%n", p.getFirstName(), p.getAddress().getCity(), carList); } else { System.out.printf("name is %s city is %s cars available None%n", p.getFirstName(), p.getAddress().getCity()); }
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

