gpt4 book ai didi

java - Jackson 在序列化期间排除了容器(List、Map、Collection)的类型信息

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:52:39 25 4
gpt4 key购买 nike

Jackson 中,我想为每个自定义对象包含类型信息。为了在没有注释的情况下完成此操作,我正在使用

OBJECT_MAPPER.enableDefaultTypingAsProperty(DefaultTyping.NON_FINAL, "@Ketan");

它正在工作,但它还包括 List 的类型信息, Map , Collection就像容器本身。

让我给你一个标准的例子Animal , Dog , CatZoo层次结构。

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;
}

}

在这里,我有两个自定义对象,CatDog .我只想包括那些类型信息,但它包括容器 – 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
}
}

一切对我来说都很好,除了我强调的 - java.util.ArrayList在 JSON 字符串中。我不想要这样的容器类型信息。

在不覆盖 TypeResolverBuilder 的情况下,API 级别以上是否有任何简单的支持来实现这一点?或任何定制?

最佳答案

如果您扩展类 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);
}
});

关于java - Jackson 在序列化期间排除了容器(List、Map、Collection)的类型信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12419295/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com