让我们假设我们有以下结构:
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的键的值。
答案 0 :(得分:0)
以下是我的问题的解决方案,但JsonTypeInfo.As.EXTERNAL_PROPERTY
自1.9版本开始:(
Jackson JsonTypeInfo.As.EXTERNAL_PROPERTY doesn't work as expected