本文介绍如何通过 Jackson 的 @JsonCreator 和 @JsonProperty 注解,在反序列化时自动将嵌套结构(如 field3.type)扁平化为外层字段(field3),全程无需手动解析或修改原始 JSON。
本文介绍如何通过 jackson 的 `@jsoncreator` 和 `@jsonproperty` 注解,在反序列化时自动将嵌套结构(如 `field3.type`)扁平化为外层字段(`field3`),全程无需手动解析或修改原始 json。
在实际开发中,常遇到服务端返回的 JSON 存在冗余嵌套层级(例如 "field3": {"type": {"f1":"v1","f2":"v2"}}),而业务逻辑更期望直接操作扁平后的结构(即 "field3": {"f1":"v1","f2":"v2"})。Jackson 原生不支持自动“路径映射式”扁平化,但可通过自定义反序列化逻辑 + 构造器注解优雅实现——核心在于利用 @JsonCreator 指定带参构造器,并用 @JsonProperty 显式绑定嵌套路径中的子字段。
以下是一个完整、可运行的示例:
import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
public class JsonFlatteningExample {
static final ObjectMapper objectMapper = new ObjectMapper();
public static class Flattened {
public String field1;
public String field2;
public Field3Class field3;
}
public static class Field3Class {
public String f1;
public String f2;
// ✅ 关键:使用 @JsonCreator + @JsonProperty("type") 将嵌套对象 "type" 直接注入构造器
@JsonCreator
public Field3Class(@JsonProperty("type") Type type) {
if (type != null) {
this.f1 = type.f1;
this.f2 = type.f2;
}
}
// 内部类仅用于接收原始嵌套结构,不暴露给上层 API
public static class Type {
public String f1;
public String f2;
}
}
public static void main(String[] args) throws IOException {
String json = """
{
"field1":"value1",
"field2":"value2",
"field3": {
"type": {
"f1":"v1",
"f2":"v2"
}
}
}
""";
Flattened result = objectMapper.readValue(json, Flattened.class);
System.out.println(objectMapper.writeValueAsString(result));
// 输出:{"field1":"value1","field2":"value2","field3":{"f1":"v1","f2":"v2"}}
}
}
✅ 关键要点说明:
- @JsonCreator 标记的构造器会接管 Field3Class 的反序列化过程,替代默认无参构造 + setter 模式;
- @JsonProperty("type") 明确告诉 Jackson:JSON 中 "field3" 下的 "type" 字段应被解析为 Type 类型并传入该构造器;
- 在构造器内部完成字段提取与赋值,实现逻辑层面的“扁平化”,对外保持 Field3Class 接口简洁;
- 无需编写自定义 Deserializer,也无需修改原始 JSON 或预处理字符串,完全通过注解驱动。
⚠️ 注意事项:
- 若 field3 中可能不存在 "type" 字段,请在构造器中添加空值判断(如示例所示),避免 NullPointerException;
- 此方案适用于单层嵌套提取(如 a.b.c → a.c),多级深度嵌套需逐层定义中间类;
- 所有参与反序列化的类及字段建议显式声明 public 或提供 getter/setter,确保 Jackson 可访问性;
- 如需双向支持(序列化时也输出扁平结构),可配合 @JsonUnwrapped 或自定义序列化器,但本场景仅聚焦反序列化扁平化。
该方法兼顾简洁性与可维护性,是 Jackson 生态中实现轻量级结构适配的推荐实践。










