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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 10:27:01