使用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
相关产品推荐
相关产品推荐

