小编典典

杰克逊反序列化多余的字段作为地图

json

我想反序列化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可以是更复杂但众所周知的一致类型)?


阅读 288

收藏
2020-07-27

共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);
    }
}

我首先在此博客文章中找到了此功能)。

2020-07-27