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

Jackson反序列化带Map属性POJO时动态字段映射为空如何解决

问题根因

你定义的values Map为空,核心原因是JSON中动态的表头字段(Heading1、Heading2等)是和id平级的字段,并没有封装在values对应的嵌套结构中,Jackson默认不会将未匹配到类属性的字段自动写入你定义的values Map。


解决方案

你不需要调整ObjectMapper的配置,也不需要额外使用TypeReference,只需要修改QueryResultRow类,添加Jackson的@JsonAnySetter注解即可实现动态字段的自动收集:

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

public class QueryResultRow {
    private int id;
    // 提前初始化Map避免空指针
    private Map<String, CellValue> values = new HashMap<>();

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Map<String, CellValue> getValues() {
        return values;
    }

    // 核心注解:所有未匹配到类属性的key-value都会进入这个方法
    @JsonAnySetter
    public void putDynamicValue(String key, CellValue value) {
        this.values.put(key, value);
    }

    // (可选)如果后续需要将对象序列化回原始JSON格式,添加该注解
    // 作用是序列化时把values中的键值对展开为平级字段
    @JsonAnyGetter
    public Map<String, CellValue> getDynamicValues() {
        return this.values;
    }
}

补充说明

你给出的JSON示例存在语法错误(rows是数组但内部直接写键值对,缺少对象包裹,正确结构应该是"rows": [{"id":1, "Heading1": {...}}]),这属于编写示例的笔误,若实际业务返回的JSON是该错误结构,需要先修正JSON结构再反序列化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 20:39:03