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

