【问题标题】:How to deserialize a Map<String, Object> using different type for different key with jackson?如何使用不同类型的不同类型的杰克逊反序列化 Map<String, Object>?
【发布时间】:2015-11-11 02:50:36
【问题描述】:

有一个库类,定义是:

class LibraryBean {
    public String tag;
    public Map<String, Object> attributes;
}

在我的应用程序代码中,我知道attributes 映射的所有可能键,并且某个键的值类型是固定的,例如,如果键是"location",那么值类型是Location ,如果键是"timestamp",那么值类型是Long。将ArrayList&lt;LibraryBean&gt; 写入 json 字符串很简单,但如何反序列化 json 字符串以使值恢复其类型?

public void test(ArrayList<LibraryBean> sampleList) { 
        ObjectMapper mapper = new ObjectMapper();
        String jsonString = mapper.writeAsString(sampleList);

        List<LibraryBean> recovered = mapper.readValue(jsonString); // what should I do here?

        // I'm sure sampleList.get(0).attributes.get("location") != null
        AssertTrue(sampleList.get(0).attributes.get("location") instanceof Location);
    }

【问题讨论】:

  • 拥有不同值类型的映射不是一个好主意。考虑为每种类型创建一个映射以避免强制转换。

标签: java json jackson


【解决方案1】:

为已知字段创建你的 pojo:

class Attributes {
    private Location location;
    ...
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    ... getters and setters

    @JsonAnyGetter
    public Map<String, Object> getAdditionalProperties() {
        return this.additionalProperties;
    }

    @JsonAnySetter
    public void setAdditionalProperty(String name, Object value) {
        this.additionalProperties.put(name, value);
    }

}

class LibraryBean {
    private String tag;
    private Attributes attributes;

    ... getters and setters
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 2021-09-09
    相关资源
    最近更新 更多