You need to enable JavaScript to run this app. 使用Jackson映射动态键嵌套对象:如何用自定义Model替代Map结构?
优惠活动
大模型
产品
解决方案
定价
更多

使用Jackson映射动态键嵌套对象:如何用自定义Model替代Map结构?

解决方案

你可以通过Jackson提供的@JsonAnySetter + @JsonAnyGetter注解实现自定义实体类对动态键的映射,不需要嵌套Map结构,具体修改如下:

1. 调整UserMap实体类

直接在原有的UserMap类中添加动态键值的捕获和输出逻辑,修改后的代码如下:

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

public class UserMap {
    private String requestId;
    private User user;

    // 反序列化时捕获动态键值对
    @JsonAnySetter
    public void setDynamicEntry(String requestId, User user) {
        this.requestId = requestId;
        this.user = user;
    }

    // 序列化时还原为原JSON的动态键结构(不需要序列化可以删除这个方法)
    @JsonAnyGetter
    public Map<String, User> getDynamicEntry() {
        return Collections.singletonMap(requestId, user);
    }

    // 原有getter、setter保留即可
    public String getRequestId() {
        return requestId;
    }

    public void setRequestId(String requestId) {
        this.requestId = requestId;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

2. 保留原有Payload类结构

不需要修改Payload类的users字段定义,保持List<UserMap>类型即可正常完成反序列化:

public class Payload {
    @JsonProperty("name")
    private String name;

    @JsonProperty("org")
    private String org;

    @JsonProperty("users")
    private List<UserMap> users;
    
    // 原有getters、setters不变
}

3. 处理最外层动态键

你给出的JSON最外层也是动态键(示例为123456789),反序列化时可以直接用Map<String, Payload>类型接收结果,不需要额外自定义实体。

补充说明

  • 如果不需要将实体序列化为原JSON结构,可以直接删除@JsonAnyGetter修饰的方法即可
  • 这种方式不需要额外修改ObjectMapper配置,侵入性低,完全符合自定义实体类的需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 02:57:01