如何用Jackson注解实现带唯一ID属性的JSON到嵌套POJO自动映射
Jackson动态key映射解决方案
前置准备:定义员工基础POJO
首先创建存储员工属性的Employee类:
public class Employee { private String firstName; private String lastName; // 必须提供无参构造 public Employee() {} // getters and setters public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } }
方案1:直接修改Company类省略Employees包装类(推荐)
如果允许调整原有Company类的字段定义,直接用Map接收动态键值对即可,Jackson会自动完成映射:
public class Company { // 注意JSON中的键为大写开头的Employees,要和JsonProperty值匹配 @JsonProperty("Employees") private Map<String, Employee> employees; // getters and setters public Map<String, Employee> getEmployees() { return employees; } public void setEmployees(Map<String, Employee> employees) { this.employees = employees; } }
Map的键就是员工唯一ID,值为对应员工对象,直接调用employees.get("1355075")即可获取对应员工。
方案2:保留Employees包装类
如果必须保留原有Company类中的Employees类型字段,通过@JsonAnySetter和@JsonAnyGetter注解实现动态属性映射:
import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; import java.util.HashMap; import java.util.Map; public class Employees { private Map<String, Employee> employeeMap = new HashMap<>(); // 反序列化时,所有未匹配到显式声明的属性都会进入此方法 @JsonAnySetter public void addEmployee(String employeeId, Employee employee) { employeeMap.put(employeeId, employee); } // 序列化时,会将该Map的键值对作为JSON的同级属性输出 @JsonAnyGetter public Map<String, Employee> getEmployeeMap() { return employeeMap; } // 可按需扩展工具方法,比如按ID查询员工 public Employee getById(String employeeId) { return employeeMap.get(employeeId); } }
注意事项
- 所有参与序列化/反序列化的POJO必须提供公共无参构造方法,否则Jackson会抛出实例化异常。
- 注意
@JsonProperty的值要和JSON中的实际键名大小写完全匹配,示例中JSON的根节点下是大写开头的Employees,如果填小写employees会导致映射为空。 - 如果员工ID为纯数字,可将Map的键类型替换为
Long或Integer,Jackson会自动完成类型转换。
内容的提问来源于stack exchange,提问作者Arya Atighehchian
相关产品推荐
相关产品推荐

