Jackson Polymorfic @JsonTypeInfo 类型属性始终为 null

js

1个回答

写回答

17600888585

2025-07-05 07:35

+ 关注

JS
JS

Jackson Polymorfic @JSonTypeInfo 类型属性始终为 null 的问题

在使用 Jackson 库进行 Java 对象与 JSON 之间的转换时,我们经常会遇到需要处理多态类型的情况。为了正确地序列化和反序列化多态对象,Jackson 提供了 @JSonTypeInfo 注解来指定类型信息的存储和检索方式。然而,有时我们可能会遇到 @JSonTypeInfo 注解使用后,类型属性始终为 null 的问题。本文将探讨这个问题,并提供解决方案。

问题描述

在使用 @JSonTypeInfo 注解时,我们通常会指定其属性 "use" 的取值为 "JSonTypeInfo.Id.NAME",并使用 "property" 属性来指定类型属性的名称。然而,有时我们可能会发现,当使用这种方式时,生成的 JSON 字符串中的类型属性始终为 null。这将导致在反序列化时无法正确地还原对象的类型。

解决方案

要解决类型属性为 null 的问题,我们需要进一步指定 @JSonTypeInfo 注解的 "include" 属性。该属性用于指定类型信息的包含级别,可以取以下三个值:

1. JSonTypeInfo.As.PROPERTY:将类型信息作为属性包含在 JSON 字符串中。

2. JSonTypeInfo.As.EXISTING_PROPERTY:如果类型属性已经存在于 JSON 字符串中,则将类型信息作为属性包含在其中。

3. JSonTypeInfo.As.WRAPPER_OBJECT:将类型信息作为包装对象的属性包含在 JSON 字符串中。

在大多数情况下,我们可以使用 JSonTypeInfo.As.PROPERTY 值来解决类型属性为 null 的问题。下面是一个示例代码:

public class Animal {

private String name;

// 省略构造器和 getter、setter 方法

@JSonTypeInfo(use = JSonTypeInfo.Id.NAME, include = JSonTypeInfo.As.PROPERTY, property = "type")

@JSonSubTypes({

@JSonSubTypes.Type(value = Dog.class, name = "dog"),

@JSonSubTypes.Type(value = Cat.class, name = "cat")

})

public static class AnimalSerializer {

public static void mAIn(String[] args) throws JSonProcessingException {

Animal dog = new Dog("Buddy");

Animal cat = new Cat("Kitty");

ObjectMapper mapper = new ObjectMapper();

String dogJSon = mapper.writeValueAsString(dog);

String catJSon = mapper.writeValueAsString(cat);

System.out.println(dogJSon);

System.out.println(catJSon);

}

}

}

public class Dog extends Animal {

// 省略构造器和 getter、setter 方法

}

public class Cat extends Animal {

// 省略构造器和 getter、setter 方法

}

在上面的例子中,我们定义了一个 Animal 类,并使用 @JSonTypeInfo 注解来指定类型属性的名称为 "type"。同时,我们使用 @JSonSubTypes 注解来指定子类的类型和对应的名称。在 AnimalSerializer 类中,我们创建了一个 Dog 对象和一个 Cat 对象,并将它们转换为 JSON 字符串。使用 ObjectMapper 的 writeValueAsString 方法,我们可以将对象转换为 JSON 字符串。最后,我们打印出转换后的 JSON 字符串。

使用上述代码运行后,我们可以看到生成的 JSON 字符串中,类型属性会正确地包含在其中,不再为 null。这样,在反序列化时就可以正确地还原对象的类型。

使用 Jackson 库进行多态对象的序列化和反序列化是非常常见的场景。然而,类型属性始终为 null 的问题可能会导致反序列化失败。为了解决这个问题,我们可以使用 @JSonTypeInfo 注解的 "include" 属性,并将其值设置为 JSonTypeInfo.As.PROPERTY。通过这种方式,我们可以确保类型属性会被正确地包含在生成的 JSON 字符串中,从而实现正确的序列化和反序列化。

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号