Java解析JSON数组为对象列表时events字段内Map值为null问题求助
问题根因
你定义的KeyValuePair类内部有个名为event的Map属性,但JSON中events数组的每个元素本身就是扁平化的键值对结构,没有外层名为event的字段包裹,Jackson找不到对应映射的字段,自然就会给event属性赋值为null。
解决方案
方案1:简化POJO结构(推荐)
直接去掉多余的KeyValuePair类,将MyClass的events字段类型改为List<Map<String, Object>>即可,Jackson会自动把每个事件对象映射为Map:
@Data @NoArgsConstructor @AllArgsConstructor @Builder @JsonIgnoreProperties(ignoreUnknown = true) public class MyClass { private String segmentId; private List<String> columns; // 直接用List<Map>接收事件数组 private List<Map<String, Object>> events; }
修改后原反序列化代码无需调整,即可正常读取所有键值对。
方案2:保留KeyValuePair结构的修正方法
如果你必须保留KeyValuePair类的结构,可以给内部的event字段配套@JsonAnySetter/@JsonAnyGetter注解,让Jackson把所有未明确映射的键值对都塞入这个Map:
@Data @NoArgsConstructor @AllArgsConstructor @Builder @JsonIgnoreProperties(ignoreUnknown = true) public static class KeyValuePair { private Map<String, Object> event = new HashMap<>(); // 所有未匹配的字段键值对都会调用这个方法塞入event @JsonAnySetter public void setEventField(String key, Object value) { event.put(key, value); } // 序列化时也能正常输出event里的所有键值对 @JsonAnyGetter public Map<String, Object> getEvent() { return event; } }
额外注意事项
你提供的示例JSON存在语法错误:"customerId": rfgvkhbj 这里的字符串值没有加双引号,会直接导致反序列化失败,请先修正JSON格式后再执行反序列化逻辑。另外建议把Map的value类型改为Object,兼容null、数字等非字符串类型的取值。
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

