让我们假设我们有以下结构:
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对象(具有不同的键),区分这些对象的方法是基于名为typeOfSomeClass的“基本”JSON中的键的值。
发布于 2016-08-03 16:47:02
以下是我的问题的解决方案,但是JsonTypeInfo.As.EXTERNAL_PROPERTY
是从1.9版本开始的:(
Jackson JsonTypeInfo.As.EXTERNAL_PROPERTY doesn't work as expected
https://stackoverflow.com/questions/38693577
复制相似问题