You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 14:33:12