如何配置Jackson在反序列化时将未识别JSON数据存入指定字段
如何让Jackson在反序列化时把未识别的JSON字段存入指定字段?
你现在的情况是:你的MyPojo类只定义了几个和JSON对应的字段,但服务器返回的JSON里有额外的字段(比如globalId、status这些),想要把这些没被识别的字段统一存到POJO里的某个指定字段对吧?
下面给你两种常用的实现方式:
方法一:使用@JsonAnySetter注解
这是最直接且推荐的方式,你可以在MyPojo里添加一个Map类型的字段,然后用@JsonAnySetter标注一个setter方法,Jackson会自动把所有未匹配的字段存入这个Map中。
修改后的MyPojo代码如下:
public class MyPojo { @JsonProperty("description") protected String content; @JsonProperty("name") protected String title; @JsonProperty("property") protected List<Property> property; @JsonProperty("documentKey") protected String iD; // 用来存储所有未被识别的JSON字段 protected Map<String, Object> extraFields = new HashMap<>(); // 原有的Getters and setters... // Jackson会自动调用这个方法,处理所有未匹配的JSON键值对 @JsonAnySetter public void setExtraField(String key, Object value) { this.extraFields.put(key, value); } // 对应的getter方法,方便你获取这些额外字段 public Map<String, Object> getExtraFields() { return extraFields; } }
这样配置后,服务器返回的globalId、status这类未被POJO定义的字段,都会自动存入extraFields这个Map里,你可以通过getExtraFields()随时获取这些数据。
方法二:关闭未知字段报错+自定义反序列化(仅特殊场景使用)
默认情况下,Jackson遇到未识别的字段会抛出UnrecognizedPropertyException,你可以先关闭这个特性,再结合自定义反序列化器收集字段,但这种方式复杂度高,一般不推荐,除非你有特殊的处理逻辑。
如果确实需要这种方式,步骤如下:
- 配置
ObjectMapper关闭未知字段报错:
ObjectMapper objectMapper = new ObjectMapper(); objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
- 编写自定义反序列化器,在反序列化过程中手动收集未识别的字段,但这需要编写更多定制化代码,远不如第一种方案简洁高效。
总结来说,@JsonAnySetter注解的方案是最适合你的需求的,简单易实现,完全能满足把未识别JSON数据存入指定字段的要求。
内容的提问来源于stack exchange,提问作者Sujan S Ravi K
相关产品推荐
相关产品推荐

