Jackson 在序列化期间排除容器(列表、地图、集合)的类型信息

Ket*_*tan 4 java json jackson

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

OBJECT_MAPPER.enableDefaultTypingAsProperty(DefaultTyping.NON_FINAL, "@Ketan");
Run Code Online (Sandbox Code Playgroud)

这是工作,但它也包括类型信息ListMapCollection像容器本身。

让我给你一个标准的例子AnimalDogCatZoo层次。

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

}
Run Code Online (Sandbox Code Playgroud)

在这里,我有两个自定义对象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
    }
}
Run Code Online (Sandbox Code Playgroud)

除了我java.util.ArrayList在 JSON 字符串中突出显示的内容外,一切对我来说都很好。我不想要这样的容器类型信息。

API 级别本身是否有任何简单的支持可以在不覆盖TypeResolverBuilder或任何自定义的情况下实现这一点?

Hel*_*ira 6

如果你扩展 class 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);
    }
});
Run Code Online (Sandbox Code Playgroud)


Sta*_*Man 1

不,除非您将集合声明为最终类型。