You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 06:35:40