琐碎的JSON杰克逊多态反序列化

时间:2016-09-29 10:43:39

标签: java json serialization jackson deserialization

挣扎着看似微不足道的东西,应该没有任何问题。我有一个带有“@class”属性的JSON,并且在调用时不知道它的类readValue()想要将它反序列化为“@class”引用的类的对象。我得到的是“LinkedHashMap”。

@Test
public void toJsonAndBack() throws Exception {
    ObjectMapper mapper = new ObjectMapper();
    String json = mapper.writeValueAsString(new Sample("id"));
    assertTrue(json.contains("@class"));
    Sample obj = (Sample)mapper.readValue(json, Object.class);
}

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS)
static class Sample {
    private String id;

    public Sample() {
    }

    public Sample(String id) {
        this.id = id;
    }

    public String getId() {
        return id;
    }
}

抱歉,如果重复,但找​​不到完全相同的问题。大多数人都有更复杂的案例,其中有基类,也有注释等。这些案例实际上工作正常。

我正在使用杰克逊2.6.6

2 个答案:

答案 0 :(得分:1)

杰克逊将其转换为LinkedhashMap,以便稍后我们可以使用其转换方法将给定的LinkedhashMap转换为自定义对象。所以在这里你需要再添加一个步骤。

E.g:

ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(new Sample("id"));
Object obj = mapper.readValue(json, Object.class);
Sample sample = mapper.convertValue(obj, Sample.class);

因此,您可以在某处保留此obj,并可在方便时将其转换为Sample类。

答案 1 :(得分:0)

显然添加此行会使此测试工作:

mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);

在这种情况下,Sample类上的注释不是必需的。