Jackson - @JsonTypeInfo 属性被映射为 null

javaJS

1个回答

写回答

w中国人

2025-06-26 12:05

+ 关注

Java
Java

Jackson是一个用于在Java对象和JSON数据之间进行转换的流行库。它提供了许多注解,以帮助开发人员控制JSON序列化和反序列化的行为。其中一个注解是@JSonTypeInfo,它用于指定在序列化和反序列化期间如何处理Java对象的类型信息。

@JSonTypeInfo注解允许开发人员在序列化和反序列化期间包含类型信息。在默认情况下,Jackson会将类型信息作为一个特殊的属性添加到JSON中。然而,有时候类型信息可能会被映射为null的问题。那么让我们来看一下为什么会发生这种情况以及如何解决它。

首先,让我们来看一个简单的示例,演示了如何使用@JSonTypeInfo注解以及它可能遇到的问题。假设我们有一个基类Animal和两个子类Cat和Dog。我们希望在序列化和反序列化期间保留类型信息。

Java

@JSonTypeInfo(

use = JSonTypeInfo.Id.NAME,

include = JSonTypeInfo.As.PROPERTY,

property = "type"

)

public class Animal {

private String name;

// getters and setters

}

public class Cat extends Animal {

private String color;

// getters and setters

}

public class Dog extends Animal {

private String breed;

// getters and setters

}

在上面的示例中,我们使用@JSonTypeInfo注解指定了类型信息应该作为一个名为"type"的属性添加到JSON中。现在,让我们来看一个可能会导致类型信息映射为null的问题。

Java

ObjectMapper mapper = new ObjectMapper();

// 序列化

String JSon = mapper.writeValueAsString(new Cat("Whiskers", "gray"));

System.out.println(JSon);

// 反序列化

Cat cat = mapper.readValue(JSon, Cat.class);

System.out.println(cat.getName());

System.out.println(cat.getcolor());

在上面的代码中,我们首先将一个Cat对象序列化为JSON字符串。然后,我们尝试将该JSON字符串反序列化为Cat对象。如果一切正常,我们应该能够获取Cat对象的属性值。然而,当我们运行这段代码时,我们会发现类型信息被映射为null,导致反序列化失败。

这是因为Jackson默认情况下在序列化和反序列化期间不包含类型信息。为了解决这个问题,我们需要在ObjectMapper上设置一个特殊的配置。

Java

ObjectMapper mapper = new ObjectMapper();

// 设置包含类型信息的配置

mapper.enableDefaultTyping(DefaultTyping.NON_FINAL, JSonTypeInfo.As.PROPERTY);

// 序列化

String JSon = mapper.writeValueAsString(new Cat("Whiskers", "gray"));

System.out.println(JSon);

// 反序列化

Cat cat = mapper.readValue(JSon, Cat.class);

System.out.println(cat.getName());

System.out.println(cat.getcolor());

在上面的代码中,我们通过调用mapper.enableDefaultTyping()方法来启用类型信息的包含。我们使用DefaultTyping.NON_FINAL参数来指定只包括非final类的类型信息,并使用JSonTypeInfo.As.PROPERTY参数来指定类型信息应该作为一个属性添加到JSON中。

现在,当我们运行这段代码时,我们会发现类型信息被正确地映射到JSON中,反序列化也成功完成。

解决@JSonTypeInfo属性被映射为null的问题

通过上面的示例,我们了解到如果没有正确配置@JSonTypeInfo注解,类型信息可能会被映射为null。为了解决这个问题,我们需要在ObjectMapper上启用类型信息的包含。

首先,我们需要创建一个ObjectMapper对象。然后,我们可以通过调用mapper.enableDefaultTyping()方法来启用类型信息的包含。我们需要选择一个DefaultTyping参数来指定要包含的类型信息的级别。在大多数情况下,使用DefaultTyping.NON_FINAL参数就足够了。最后,我们还需要指定类型信息应该作为什么类型的属性添加到JSON中。这可以通过使用JSonTypeInfo.As枚举的一个值来实现。

在解决了@JSonTypeInfo属性被映射为null的问题后,我们可以确保在序列化和反序列化期间正确地处理类型信息。这对于需要在Java对象和JSON数据之间进行转换的应用程序非常重要。

一下,@JSonTypeInfo是一个重要的注解,用于在Jackson库中控制类型信息的处理。如果类型信息被映射为null,我们可以通过在ObjectMapper上启用类型信息的包含来解决这个问题。这样,我们就可以确保在序列化和反序列化期间正确地处理类型信息。

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号