从包装类杰克逊

时间:2016-08-01 07:52:27

标签: java json jackson

让我们假设我们有以下结构:

class BaseClass {
    ...
    String typeOfSomeClass;
    SomeClassBasedOnType someClassBasedOnType;
}

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=As.PROPERTY, property="BaseClass.typeOfSomeClass")
@JsonSubTypes({
    @Type(value = SomeClassBasedOnTypeImpl1.class, name="type1"),
    @Type(value = SomeClassBasedOnTypeImpl2.class, name="type2")
})
interface SomeClassBasedOnType {
}
@JsonTypeName("type1")
class SomeClassBasedOnTypeImpl1 implements SomeClassBasedOnType {
    String str1;
}
@JsonTypeName("type2")
class SomeClassBasedOnTypeImpl2 implements SomeClassBasedOnType {
    String str2;
}

通过上述结构,我想使用Jackson存储JSON。我需要解析的两个可能的JSON是:

{"typeOfSomeClass":"type1", "someClassBasedOnType": {"str1":"someValue"}}

{"typeOfSomeClass":"type2", "someClassBasedOnType": {"str2":"someValue"}}

这是我用来反序列化JSON的代码:

BaseClass baseClass = new ObjectMapper().readValue(someJsonAsString, BaseClass.class);

唯一的问题是我不知道如何从“基础”JSON中获取类型。语法:...property="BaseClass.typeOfSomeClass"仍然在SomeClassBasedOnType实现类中查找属性。任何想法如何指定我需要包装类中的属性?

只是为了澄清“基础”JSON包含许多密钥,它们都包含密钥someClassBasedOnType。然而,关键someClassBasedOnType可能包含两个不同的JSON对象(具有不同的键),区分这些对象的方式基于“base”JSON中名为typeOfSomeClass的键的值。

1 个答案:

答案 0 :(得分:0)

以下是我的问题的解决方案,但JsonTypeInfo.As.EXTERNAL_PROPERTY自1.9版本开始:(

Jackson JsonTypeInfo.As.EXTERNAL_PROPERTY doesn't work as expected