
本文介绍如何使用 Jackson 直接解析形如 {"status": 200, "result": [[...], [...], ...]} 的嵌套数组结构,无需自定义反序列化器,通过合理声明字段类型(如 Object[][] 或 List)即可完成高效、类型安全的映射。
本文介绍如何使用 jackson 直接解析形如 {"status": 200, "result": [[...], [...], ...]} 的嵌套数组结构,无需自定义反序列化器,通过合理声明字段类型(如 object[][] 或 list>)即可完成高效、类型安全的映射。
要解析包含嵌套数组的 JSON(例如 result 字段为二维数组),Jackson 提供了开箱即用的支持——关键在于为 result 字段选择合适的数据类型,而非必须编写自定义 JsonDeserializer。
推荐方案:两种简洁且通用的字段声明方式
✅ 方案一:使用二维数组 Object[][]
适用于结构固定、元素类型混合(如整数、字符串等)且对内存/性能较敏感的场景:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
@JsonIgnoreProperties(ignoreUnknown = true)
public class TestDto {
@JsonProperty("status")
private Integer status;
@JsonProperty("result")
private Object[][] result; // 自动映射为二维数组
// getters and setters
public Integer getStatus() { return status; }
public void setStatus(Integer status) { this.status = status; }
public Object[][] getResult() { return result; }
public void setResult(Object[][] result) { this.result = result; }
}
✅ 方案二:使用嵌套泛型集合 List>
更灵活、支持动态扩容,语义清晰,推荐用于业务逻辑中需遍历或修改数据的场景:
@JsonIgnoreProperties(ignoreUnknown = true)
public class TestDto {
@JsonProperty("status")
private Integer status;
@JsonProperty("result")
private List<list>> result; // Jackson 自动转换为嵌套 List
// getters and setters
public Integer getStatus() { return status; }
public void setStatus(Integer status) { this.status = status; }
public List<list>> getResult() { return result; }
public void setResult(List<list>> result) { this.result = result; }
}</list></list></list>
使用示例(完整解析流程)
String json = """
{
"status": 200,
"result": [
[123, "FOO", "BAR", 456],
[123, "FOO", "BAR", 456]
]
}
""";
ObjectMapper mapper = new ObjectMapper();
TestDto dto = mapper.readValue(json, TestDto.class);
System.out.println("Status: " + dto.getStatus()); // 输出: 200
for (List<object> row : dto.getResult()) {
System.out.println(row); // [123, "FOO", "BAR", 456]
}</object>
注意事项与最佳实践
-
类型安全性:若 result 中每行结构一致(如均为 [Integer, String, String, Integer]),可进一步定义为 List
并配合 @JsonCreator 构造器提升类型安全; -
空值/缺失处理:建议为 result 字段添加 @JsonProperty(required = false) 或初始化为空集合(如 private List
- > result = new ArrayList();),避免 null 引发 NPE;
-
性能考量:Object[][] 序列化/反序列化开销略低于嵌套 List,但牺牲了可变性;高频读写且需增删时优先选 List
- >;
- 兼容性:两种方式均兼容 Jackson 2.10+,无需额外依赖或配置。
综上,面对嵌套数组 JSON,无需复杂定制——合理选用 Object[][] 或 List> 即可实现简洁、健壮、可维护的反序列化逻辑。










