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

如何用Jackson序列化实现字段值输出不输出键名及字段重命名

解决方案:用Jackson注解实现自定义JSON序列化

这个需求其实用Jackson的几个核心注解就能轻松搞定,我来给你一步步讲清楚怎么做:

1. 依赖准备

首先确保你的项目里引入了Jackson的核心依赖(以Maven为例):

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version> <!-- 建议使用最新稳定版 -->
</dependency>

2. 修改MyClass实现自定义序列化

我们需要用到三个关键注解来实现需求:

  • @JsonProperty:给字段重命名
  • @JsonIgnore:忽略不需要直接序列化的字段
  • @JsonAnyGetter:动态将额外内容展开到JSON对象中

修改后的类代码如下:

import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.util.Map;

public class MyClass {
    // 用@JsonProperty把id字段重命名为identifier
    @JsonProperty("identifier")
    private final String id;
    
    // 用@JsonIgnore标记这个字段,避免它被直接序列化输出
    @JsonIgnore
    private final String additionalJson;
    
    // 复用ObjectMapper实例(建议全局单例,避免重复创建)
    private static final ObjectMapper objectMapper = new ObjectMapper();

    public MyClass(String id, String additionalJson) {
        this.id = id;
        this.additionalJson = additionalJson;
    }

    // 用@JsonAnyGetter让Jackson把Map的键值对直接嵌入JSON对象
    @JsonAnyGetter
    public Map<String, Object> getAdditionalProperties() {
        try {
            // 将additionalJson解析为Map,实现内容展开
            return objectMapper.readValue(additionalJson, Map.class);
        } catch (IOException e) {
            // 这里可以根据业务需求调整异常处理逻辑,比如返回空Map或抛出运行时异常
            throw new RuntimeException("Failed to parse additionalJson content", e);
        }
    }

    // 可选:添加getter方法供业务代码访问字段
    public String getId() {
        return id;
    }

    public String getAdditionalJson() {
        return additionalJson;
    }
}

3. 测试序列化效果

写个简单的测试代码验证结果:

import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;

public class SerializationTest {
    public static void main(String[] args) throws IOException {
        // 创建测试实例:id=1234,additionalJson为{"someKey": "someValue"}
        MyClass myObj = new MyClass("1234", "{\"someKey\": \"someValue\"}");
        
        ObjectMapper mapper = new ObjectMapper();
        String jsonResult = mapper.writeValueAsString(myObj);
        
        // 输出结果:{"identifier":"1234","someKey":"someValue"}
        System.out.println(jsonResult);
    }
}

关键注解说明

  • @JsonProperty("identifier"):明确告诉Jackson在序列化id字段时,使用identifier作为JSON属性名。
  • @JsonIgnore:让Jackson跳过additionalJson字段的直接序列化,避免输出"additionalJson": "..."这样的冗余内容。
  • @JsonAnyGetter:这个注解是核心——它会把方法返回的Map拆解成键值对,直接合并到当前的JSON对象中,完美实现了把additionalJson的原始内容展开的需求。

如果你的additionalJson包含嵌套的JSON结构,这个方案也能正常处理,Jackson会自动将嵌套JSON解析为嵌套Map并序列化。

内容的提问来源于stack exchange,提问作者Johannes Dorn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:00:59