
本文介绍如何使用 Jackson 直接解析形如 "result": [[123,"FOO","BAR",456], [...]] 的嵌套数组结构,无需自定义反序列化器,通过合理声明字段类型(如 Object[][] 或 List)即可完成高效、类型安全的映射。
本文介绍如何使用 jackson 直接解析形如 `"result": [[123,"foo","bar",456], [...]]` 的嵌套数组结构,无需自定义反序列化器,通过合理声明字段类型(如 `object[][]` 或 `list>`)即可完成高效、类型安全的映射。
在处理动态结构的 JSON 数据时,尤其是当 result 字段为“数组的数组”(即二维数组)且内部元素类型不统一(如同时包含数字、字符串等)时,开发者常误以为必须编写自定义 JsonDeserializer。实际上,Jackson 原生支持多种灵活的集合与数组类型映射,只需在 DTO 中正确定义字段即可。
以下是一个完整、可直接使用的 DTO 示例:
@JsonIgnoreProperties(ignoreUnknown = true)
public class TestDto {
@JsonProperty("status")
private Integer status;
// 方案一:使用 Object[][] —— 适合已知固定维度、追求轻量和性能的场景
@JsonProperty("result")
private Object[][] result;
// 方案二(推荐):使用 List<list>> —— 更具扩展性,支持动态长度、便于遍历和函数式操作
// @JsonProperty("result")
// private List<list>> result;
// Getter & Setter
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<list>>,则对应添加如下方法:
/*
public List<list>> getResult() {
return result;
}
public void setResult(List<list>> result) {
this.result = result;
}
*/
}</list></list></list></list></list>
✅ 使用示例(配合 ObjectMapper):
ObjectMapper mapper = new ObjectMapper();
String json = "{\n" +
" \"status\": 200,\n" +
" \"result\": [\n" +
" [123, \"FOO\", \"BAR\", 456],\n" +
" [789, \"BAZ\", \"QUX\", 101]\n" +
" ]\n" +
"}";
TestDto dto = mapper.readValue(json, TestDto.class);
System.out.println("Status: " + dto.getStatus()); // 输出: Status: 200
// 遍历二维结果(以 Object[][] 为例)
for (Object[] row : dto.getResult()) {
System.out.println(Arrays.toString(row));
// 输出: [123, FOO, BAR, 456] 和 [789, BAZ, QUX, 101]
}
⚠️ 注意事项:
- Object[][] 在反序列化时要求 JSON 中 result 严格为二维数组;若存在 null 行或非数组元素,会抛出 JsonMappingException;
- List
- > 更健壮,能自然兼容空数组([])或缺失字段(配合 @JsonInclude(Include.NON_NULL) 可控处理);
- 若需类型安全(例如明确知道每行是 [Integer, String, String, Integer]),建议定义专用内嵌类(如 RecordItem)并使用 List
,而非泛型 Object; - 所有字段均应添加 @JsonProperty 显式标注(尤其当字段名与 JSON key 不一致时),避免因命名策略导致映射失败。
综上,面对嵌套数组结构,优先尝试 Jackson 内置集合/数组类型——简洁、可靠、无侵入。仅当存在复杂逻辑(如字段动态键名、混合类型歧义、需上下文校验)时,再考虑实现 JsonDeserializer。











