Sprint Boot @JsonTypeInfo使用方法详解

  • Post category:Java

@JsonTypeInfo是Spring Boot框架中的一个注解,用于指定序列化和反序列化时的类型信息。在实际开发中,我们可能需要将Java对象序列化为JSON字符串,或将JSON字符串反序列化为Java对象。使用@JsonTypeInfo注解可以方便地指定类型信息,以便在序列化和反序列化时能够正确地识别对象类型。

下面是@JsonTypeInfo的使用方法的完整攻略:

1. 导入依赖

在使用@JsonTypeInfo注解之前,我们需要先导入相关的依赖。在pom.xml文件中添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>

2. 创建Java对象

在使用@JsonTypeInfo注解之前,我们需要先创建一个Java对象。例如:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
public abstract class Animal {
    private String name;
    // 省略getter和setter方法
}

@JsonTypeName("dog")
public class Dog extends Animal {
    private String breed;
    // 省略getter和setter方法
}

@JsonTypeName("cat")
public class Cat extends Animal {
    private String color;
    // 省略getter和setter方法
}

在上面的示例中,我们创建了一个Animal父类和两个子类DogCat。在父类中,我们使用@JsonTypeInfo注解来指定类型信息。@JsonTypeInfo注解的use属性用于指定类型的使用方式,include属性用于指定类型信息的包含方式,property属性用于指定类型信息的属性名。在子类中,我们使用@JsonTypeName注解来指定子类的名称。

3. 序列化和反序列化

在实际开发中,我们可能需要将Java对象序列化为JSON字符串,或将JSON字符串反序列化为Java对象。在序列化和反序列化过程中,使用@JsonTypeInfo注解可以方便地指定类型信息,以便在序列化和反序列化时能够正确地识别对象类型。例如:

Animal dog = new Dog();
dog.setName("dog");
((Dog) dog).setBreed("Golden Retriever");

Animal cat = new Cat();
cat.setName("cat");
((Cat) cat).setColor("White");

List<Animal> animals = new ArrayList<>();
animals.add(dog);
animals.add(cat);

ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(animals);

System.out.println(json); // [{"type":"dog","name":"dog","breed":"Golden Retriever"},{"type":"cat","name":"cat","color":"White"}]

List<Animal> animals = objectMapper.readValue(json, new TypeReference<List<Animal>>() {});

System.out.println(animals.get(0) instanceof Dog); // true
System.out.println(animals.get(1) instanceof Cat); // true

在上面的示例中,我们使用ObjectMapper将Java对象序列化为JSON字符串,或将JSON字符串反序列化为Java对象。在序列化和反序列化过程中,使用@JsonTypeInfo注解可以方便地指定类型信息,以便在序列化和反序列化时能够正确地识别对象类型。

4. 示例1:指定类型信息属性名

假设我们有一个动物实体类,包含name属性和两个子类DogCat。我们需要将动物对象序列化为JSON字符串,并指定类型信息属性名为animalType。我们可以使用@JsonTypeInfo注解来实现这一功能。例如:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "animalType")
public abstract class Animal {
    private String name;
    // 省略getter和setter方法
}

@JsonTypeName("dog")
public class Dog extends Animal {
    private String breed;
    // 省略getter和setter方法
}

@JsonTypeName("cat")
public class Cat extends Animal {
    private String color;
    // 省略getter和setter方法
}

Animal dog = new Dog();
dog.setName("dog");
((Dog) dog).setBreed("Golden Retriever");

ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(dog);

System.out.println(json); // {"animalType":"dog","name":"dog","breed":"Golden Retriever"}

在上面的示例中,我们使用@JsonTypeInfo注解来指定类型信息属性名为animalType。在将动物对象序列化为JSON时,类型信息属性名被指定为animalType属性的值。

5. 示例2:反序列化时指定类型信息

假设有一个JSON字符串,包含animalTypenamebreedcolor属性。我们需要将JSON字符串反序列化为动物对象,并指定类型信息。我们可以使用@JsonTypeInfo注解来实现这一功能。例如:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "animalType")
public abstract class Animal {
    private String name;
    // 省略getter和setter方法
}

@JsonTypeName("dog")
public class Dog extends Animal {
    private String breed;
    // 省略getter和setter方法
}

@JsonTypeName("cat")
public class Cat extends Animal {
    private String color;
    // 省略getter和setter方法
}

ObjectMapper objectMapper = new ObjectMapper();
String json = "{\"animalType\":\"dog\",\"name\":\"dog\",\"breed\":\"Golden Retriever\"}";

Animal animal = objectMapper.readValue(json, Animal.class);

System.out.println(animal instanceof Dog); // true

在上面的示例中,我们使用@JsonTypeInfo注解来指定类型信息。在将JSON字符串反序列化为动物对象时,类型信息被指定为animalType属性的值。

6. 总结

@JsonTypeInfo是Spring Boot框架中的一个注解,用于指定序列化和反序列化时的类型信息。使用@JsonTypeInfo注解可以方便地指定类型信息,以便在序列化和反序列化时能够正确地识别对象类型。在实际开发中我们可以根据需要使用@JsonTypeInfo注解来指定类型信息。