在杰克逊中,我想为每个自定义对象添加类型信息。要在没有注释的情况下完成此操作,我正在使用
OBJECT_MAPPER.enableDefaultTypingAsProperty(DefaultTyping.NON_FINAL, "@Ketan");
它正在运行,但它还包括List
,Map
,Collection
类似容器本身的类型信息。
让我举一个Animal
,Dog
,Cat
和Zoo
等级的标准示例。
class Zoo {
List<Cat> cats;
Dog dog;
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
public List<Cat> getCats() {
return cats;
}
public void setCats(List<Cat> cats) {
this.cats = cats;
}
}
在这里,我有两个自定义对象Cat
和Dog
。我只想包含那些类型信息,但在我的情况下它包含容器 - List
。
请参阅下面我通过序列化获得的JSON字符串。
{
"@Ketan": "com.csam.wsc.enabling.core.codec.json.test.Zoo1",
"cats": [
// This line contains the issue //
"java.util.ArrayList",
[
{
"@Ketan": "com.csam.wsc.enabling.core.codec.json.test.Cat",
"name": "animalName",
"likesCream": true,
"lives": 10
},
{
"@Ketan": "com.csam.wsc.enabling.core.codec.json.test.Cat",
"name": "animalName",
"likesCream": true,
"lives": 10
}
]
],
"dog": {
"@Ketan": "com.csam.wsc.enabling.core.codec.json.test.Dog",
"name": "animalName",
"barkVolume": 0.0
}
}
除了我在JSON字符串中突出显示的java.util.ArrayList
之外,一切都很好。我不想要这样的容器类型信息。
在没有覆盖TypeResolverBuilder
或任何自定义的情况下,上述API级别本身是否有任何简单的支持来实现此目的?
答案 0 :(得分:4)
如果你扩展课程ObjectMapper.DefaultTypeResolverBuilder
,它会变得非常简单:
OBJECT_MAPPER.setDefaultTyping(new ObjectMapper.DefaultTypeResolverBuilder(ObjectMapper.DefaultTyping.NON_FINAL) {
{
init(JsonTypeInfo.Id.CLASS, null);
inclusion(JsonTypeInfo.As.PROPERTY);
typeProperty("@Ketan");
}
@Override
public boolean useForType(JavaType t) {
return !t.isContainerType() && super.useForType(t);
}
});
答案 1 :(得分:1)
不,除非您将收藏品声明为最终类型。