我想反序列化JSON对象中的任何未知字段,作为pojo成员的映射中的条目。
例如json
{ "knownField" : 5, "unknownField1" : "926f7c2f-1ae2-426b-9f36-4ba042334b68", "unknownField2" : "ed51e59d-a551-4cdc-be69-7d337162b691" }
和pojo
class myObject{ int knownField; Map<String, UUID> unknownFields; // getters/setters whatever }
有没有办法用杰克逊配置它?如果不是,是否有一种有效的方法编写a StdDeserializer来做到这一点(假设in中的值unknownFields可以是更复杂但众所周知的一致类型)?
StdDeserializer
unknownFields
有一个功能和一个注释正好适合此目的。
经过测试,它可以像您的示例一样使用UUID:
class MyUUIDClass { public int knownField; Map<String, UUID> unknownFields = new HashMap<>(); // Capture all other fields that Jackson do not match other members @JsonAnyGetter public Map<String, UUID> otherFields() { return unknownFields; } @JsonAnySetter public void setOtherField(String name, UUID value) { unknownFields.put(name, value); } }
它将像这样工作:
MyUUIDClass deserialized = objectMapper.readValue("{" + "\"knownField\": 1," + "\"foo\": \"9cfc64e0-9fed-492e-a7a1-ed2350debd95\"" + "}", MyUUIDClass.class);
同样,更常见的类型(例如字符串)也可以工作:
class MyClass { public int knownField; Map<String, String> unknownFields = new HashMap<>(); // Capture all other fields that Jackson do not match other members @JsonAnyGetter public Map<String, String> otherFields() { return unknownFields; } @JsonAnySetter public void setOtherField(String name, String value) { unknownFields.put(name, value); } }
(我首先在此博客文章中找到了此功能)。