
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 字符串中,从而实现正确的序列化和反序列化。Copyright © 2025 IZhiDa.com All Rights Reserved.
知答 版权所有 粤ICP备2023042255号