
本文介绍如何使用 Jackson 直接解析含嵌套数组的 JSON(如 result 为二维数组),无需自定义反序列化器,通过合理声明字段类型(如 Object[][] 或 List)即可高效完成反序列化。
本文介绍如何使用 jackson 直接解析含嵌套数组的 json(如 `result` 为二维数组),无需自定义反序列化器,通过合理声明字段类型(如 `object[][]` 或 `list>`)即可高效完成反序列化。
在实际开发中,常会遇到结构不固定但层级明确的 JSON 数据,例如返回一个状态码和一组同构的行数据(每行是混合类型的值数组)。如以下示例:
{
"status": 200,
"result": [
[123, "FOO", "BAR", 456],
[123, "FOO", "BAR", 456]
]
}
该结构中,result 是一个数组的数组(即二维数组),且每项元素类型可能不同(整数、字符串等)。Jackson 支持多种方式直接映射此类结构,关键在于选择合适的 Java 类型声明。
✅ 推荐方案:使用泛型集合或原始二维数组
你无需编写自定义 JsonDeserializer —— Jackson 的默认反序列化器已原生支持以下两种简洁写法:
方案一:List>(推荐,类型安全且灵活)
@JsonIgnoreProperties(ignoreUnknown = true)
public class TestDto {
@JsonProperty("status")
private Integer status;
@JsonProperty("result")
private List<list>> result; // 自动映射为 List<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></list>
✅ 优势:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 动态长度支持(n 行任意列数);
- 可安全遍历并按索引/类型转换(如 row.get(0) instanceof Integer);
- 与 Jackson 的泛型类型推断兼容性好,不易出错。
方案二:Object[][](轻量、适合只读场景)
@JsonProperty("result")
private Object[][] result;
✅ 优势:
- 内存开销略小,语法更紧凑;
- 适合快速提取、批量处理,无需泛型擦除顾虑。
⚠️ 注意事项:
- 若需强类型校验(如确保每行第 0 项必为 Integer),建议后续对 result 做封装校验,或定义专用行类(如 RecordRow)配合 List
使用; - Object 类型需手动类型转换(如 (Integer) row[0]),注意 ClassCastException 风险;
- 确保 JSON 中 result 字段始终存在且为数组类型,否则设 @JsonProperty(required = false) 并做空值判断。
? 使用示例
String json = "{ \"status\": 200, \"result\": [[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: " + row); // [123, "FOO", "BAR", 456]
}</object>
✅ 总结
Jackson 完全支持对嵌套数组的零配置反序列化。优先选用 List> 获得最佳可读性与扩展性;若追求极简,Object[][] 同样可靠。仅当存在复杂逻辑(如动态列名映射、稀疏数组、类型混合规则异常)时,才需引入自定义 JsonDeserializer —— 绝大多数场景下,类型声明即解决方案。










