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

如何通过Jackson注解将Java类中Map属性的键值对序列化为JSON顶级键

实现Jackson将Map键值对平铺为JSON顶级字段

当然可以!Jackson框架专门提供了**@JsonAnyGetter和@JsonAnySetter**注解来搞定这个需求——前者能在序列化时把properties里的键值对直接“平铺”到JSON的顶级层级,后者则负责反序列化时把JSON中没有对应类字段的额外属性回写到Map里(如果需要支持反序列化的话)。

修改后的MyClass代码示例

import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import java.util.HashMap;
import java.util.Map;

public class MyClass {
    private String id;
    private Map<String, Object> properties = new HashMap<>();

    // 常规的id属性getter/setter
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    // 核心注解:序列化时跳过properties字段,直接输出Map内的键值对
    @JsonAnyGetter
    public Map<String, Object> getProperties() {
        return properties;
    }

    // 可选:支持反序列化时将JSON额外字段存入properties
    @JsonAnySetter
    public void addProperty(String key, Object value) {
        this.properties.put(key, value);
    }
}

注解作用说明

  • @JsonAnyGetter:标记在Map的getter方法上后,Jackson序列化对象时会忽略原有的properties字段名,直接把Map中的所有键值对作为当前对象的顶级JSON属性输出,完全匹配你期望的格式。
  • @JsonAnySetter:如果你的业务需要反序列化(比如把{"id":"123","fruit":"apple"}这样的JSON转成MyClass对象),这个注解会自动捕获所有没有对应类字段的JSON键值对,将它们存入propertiesMap中。

测试验证

写个简单的测试代码就能看到效果:

import com.fasterxml.jackson.databind.ObjectMapper;

public class SerializationTest {
    public static void main(String[] args) throws Exception {
        MyClass myObj = new MyClass();
        myObj.setId("abc-123");
        myObj.addProperty("fruit", "apple");
        myObj.addProperty("color", "red");

        ObjectMapper mapper = new ObjectMapper();
        String jsonResult = mapper.writeValueAsString(myObj);
        System.out.println(jsonResult);
        // 输出结果:{"id":"abc-123","fruit":"apple","color":"red"}
    }
}

注意事项

如果propertiesMap中的键和类的现有字段(比如id)重名,Jackson会优先使用类字段的取值,Map中的同名键值对会被忽略,这点需要在业务逻辑中注意避免冲突。

内容的提问来源于stack exchange,提问作者Gabriel Petrovay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 13:37:42