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

如何在Java Record类中使用Jackson的@JsonAnySetter注解?

Jackson @JsonAnySetter 在Java Record中生效的解决方案

问题原因

Java Record的反序列化逻辑依赖其标准构造器,Jackson会尝试将JSON字段与构造器参数一一匹配。直接在Record的Map组件上标注@JsonAnySetter无法生效,因为未知字段没有对应的构造器参数,Jackson无法自动将其填充到Map中。

可行解决方案

在Record内部定义一个带有@JsonAnySetter注解的方法,手动将未知字段写入Map组件。同时需要确保Map是可变的(比如HashMap),避免空指针异常:

record ThisDoesnt(String name, Map<String, String> others) {
    // 自定义紧凑构造器,确保others不为空且可变
    ThisDoesnt {
        if (others == null) {
            others = new HashMap<>();
        }
    }

    // 处理未知字段的方法,标注@JsonAnySetter
    @JsonAnySetter
    void addOtherField(String key, String value) {
        others.put(key, value);
    }
}

说明

  1. 自定义紧凑构造器:Jackson反序列化时,如果构造器的others参数没有匹配到对应JSON字段,会传入null。通过紧凑构造器初始化一个空的HashMap,避免后续调用put时抛出空指针异常。
  2. @JsonAnySetter方法:这个方法会接收所有未匹配到Record组件的JSON字段,将键值对存入othersMap中。
  3. 版本要求:确保使用Jackson 2.12及以上版本,该版本开始正式支持Java Record的序列化与反序列化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 20:42:16