【问题标题】:Jackson deserialize extra fields as MapJackson 将额外字段反序列化为 Map
【发布时间】:2017-01-02 12:51:42
【问题描述】:

我希望将 JSON 对象中的任何未知字段反序列化为 Map 中的条目,它是 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
}

有没有办法用 Jackson 来配置它?如果没有,是否有一种有效的方法来编写 StdDeserializer 来做到这一点(假设 unknownFields 中的值可以是更复杂但众所周知的一致类型)?

【问题讨论】:

    标签: java json jackson deserialization


    【解决方案1】:

    有一个特性和一个注释完全符合这个目的。

    我进行了测试,它适用于您的示例中的 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);
        }
    }
    

    (I found this feature in this blog post first).

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-05
      • 2018-03-17
      • 1970-01-01
      • 2014-05-19
      • 1970-01-01
      • 1970-01-01
      • 2017-01-23
      相关资源
      最近更新 更多