如何仅通过Jackson注解将嵌套JSON的field3.type扁平化至field3?
仅用Jackson注解实现指定JSON结构转换
实现步骤
1. 定义顶层实体类
创建对应顶层JSON结构的类,包含field1、field2和自定义类型的field3字段:
public class TopLevelObject { private String field1; private String field2; private Field3 field3; // Getter和Setter方法 public String getField1() { return field1; } public void setField1(String field1) { this.field1 = field1; } public String getField2() { return field2; } public void setField2(String field2) { this.field2 = field2; } public Field3 getField3() { return field3; } public void setField3(Field3 field3) { this.field3 = field3; } }
2. 定义Field3实体类并添加注解处理嵌套映射
在Field3类中,通过@JsonProperty注解指定读取原JSON中type字段的内容,并将其属性赋值到当前类的字段中;同时通过Getter方法控制序列化后的输出结构:
public class Field3 { private String f1; private String f2; // 反序列化时,读取field3下的type对象,将其属性赋值给当前类的字段 @JsonProperty("type") private void unpackType(Map<String, String> type) { this.f1 = type.get("f1"); this.f2 = type.get("f2"); } // 序列化时直接输出f1、f2字段,不生成type嵌套 public String getF1() { return f1; } public void setF1(String f1) { this.f1 = f1; } public String getF2() { return f2; } public void setF2(String f2) { this.f2 = f2; } }
3. 测试反序列化与序列化
使用Jackson的ObjectMapper进行转换,验证结果:
import com.fasterxml.jackson.databind.ObjectMapper; public class TestConversion { public static void main(String[] args) throws Exception { String originalJson = "{\n" + " \"field1\":\"value1\",\n" + " \"field2\":\"value2\",\n" + " \"field3\": {\n" + " \"type\":{\n" + " \"f1\":\"v1\",\n" + " \"f2\":\"v2\"\n" + " }\n" + " }\n" + "}"; ObjectMapper mapper = new ObjectMapper(); // 反序列化原JSON到实体类 TopLevelObject obj = mapper.readValue(originalJson, TopLevelObject.class); // 序列化实体类到目标JSON结构 String targetJson = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj); System.out.println(targetJson); } }
运行后输出的JSON结构即为期望的格式:
{ "field1" : "value1", "field2" : "value2", "field3" : { "f1" : "v1", "f2" : "v2" } }
注解说明
@JsonProperty("type"):标记unpackType方法,让Jackson在反序列化时将field3下的type对象传入该方法,完成属性的映射。- 未添加额外序列化注解:通过
Field3类的Getter方法直接暴露f1和f2字段,Jackson序列化时会自动生成对应的键值对,不会保留原有的type嵌套结构。
内容的提问来源于stack exchange,提问作者gls79
相关产品推荐
相关产品推荐

