【@JsonSubTypes 使用示例】

@JsonSubTypes注解是Jackson库中的一个注解,用于指定多态类型的子类序列化和反序列化时的类型标识。

例如,我们有一个抽象类Animal,它有两个子类Dog和Cat。我们希望在序列化和反序列化过程中能够正确地识别出具体的子类类型。

首先,我们需要在抽象类Animal上使用@JsonTypeInfo注解,指定使用类型标识字段来识别具体的子类类型。同时,还需要使用@JsonSubTypes注解,指定所有可能的子类类型。

java 复制代码
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
@JsonSubTypes({
    @JsonSubTypes.Type(value = Dog.class, name = "dog"),
    @JsonSubTypes.Type(value = Cat.class, name = "cat")
})
public abstract class Animal {
    private String name;

    public Animal(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

接下来,我们可以定义Dog和Cat两个具体的子类,它们需要继承自Animal类。

java 复制代码
public class Dog extends Animal {
    private int age;

    public Dog(String name, int age) {
        super(name);
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

public class Cat extends Animal {
    private String color;

    public Cat(String name, String color) {
        super(name);
        this.color = color;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }
}

最后,我们可以使用ObjectMapper类来进行序列化和反序列化操作。

java 复制代码
public class Main {
    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();

        // 序列化
        Dog dog = new Dog("旺财", 3);
        String dogJson = objectMapper.writeValueAsString(dog);
        System.out.println(dogJson); // {"type":"dog","name":"旺财","age":3}

        Cat cat = new Cat("小花", "white");
        String catJson = objectMapper.writeValueAsString(cat);
        System.out.println(catJson); // {"type":"cat","name":"小花","color":"white"}

        // 反序列化
        Animal deserializedDog = objectMapper.readValue(dogJson, Animal.class);
        if (deserializedDog instanceof Dog) {
            Dog deserializedDog1 = (Dog) deserializedDog;
            System.out.println(deserializedDog1.getAge());
        }

        Animal deserializedCat = objectMapper.readValue(catJson, Animal.class);
        if (deserializedCat instanceof Cat) {
            Cat deserializedCat1 = (Cat) deserializedCat;
            System.out.println(deserializedCat1.getColor());
        }
    }
}

以上代码中,我们首先使用ObjectMapper类将Dog对象和Cat对象序列化为JSON字符串,然后通过readValue方法将JSON字符串反序列化为Animal对象。最后,根据实际的类型进行类型转换。

在序列化过程中,@JsonTypeInfo注解将类型信息包括在JSON字符串中的"type"字段中。在反序列化过程中,根据"type"字段的值来决定具体的子类类型。@JsonSubTypes注解是Jackson库中的一个注解,用于指定多态类型的子类序列化和反序列化时的类型标识。

例如,我们有一个抽象类Animal,它有两个子类Dog和Cat。我们希望在序列化和反序列化过程中能够正确地识别出具体的子类类型。

首先,我们需要在抽象类Animal上使用@JsonTypeInfo注解,指定使用类型标识字段来识别具体的子类类型。同时,还需要使用@JsonSubTypes注解,指定所有可能的子类类型。

java 复制代码
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
@JsonSubTypes({
    @JsonSubTypes.Type(value = Dog.class, name = "dog"),
    @JsonSubTypes.Type(value = Cat.class, name = "cat")
})
public abstract class Animal {
    private String name;

    public Animal(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

接下来,我们可以定义Dog和Cat两个具体的子类,它们需要继承自Animal类。

java 复制代码
public class Dog extends Animal {
    private int age;

    public Dog(String name, int age) {
        super(name);
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

public class Cat extends Animal {
    private String color;

    public Cat(String name, String color) {
        super(name);
        this.color = color;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }
}

最后,我们可以使用ObjectMapper类来进行序列化和反序列化操作。

java 复制代码
public class Main {
    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();

        // 序列化
        Dog dog = new Dog("旺财", 3);
        String dogJson = objectMapper.writeValueAsString(dog);
        System.out.println(dogJson); // {"type":"dog","name":"旺财","age":3}

        Cat cat = new Cat("小花", "white");
        String catJson = objectMapper.writeValueAsString(cat);
        System.out.println(catJson); // {"type":"cat","name":"小花","color":"white"}

        // 反序列化
        Animal deserializedDog = objectMapper.readValue(dogJson, Animal.class);
        if (deserializedDog instanceof Dog) {
            Dog deserializedDog1 = (Dog) deserializedDog;
            System.out.println(deserializedDog1.getAge());
        }

        Animal deserializedCat = objectMapper.readValue(catJson, Animal.class);
        if (deserializedCat instanceof Cat) {
            Cat deserializedCat1 = (Cat) deserializedCat;
            System.out.println(deserializedCat1.getColor());
        }
    }
}

以上代码中,我们首先使用ObjectMapper类将Dog对象和Cat对象序列化为JSON字符串,然后通过readValue方法将JSON字符串反序列化为Animal对象。最后,根据实际的类型进行类型转换。

在序列化过程中,@JsonTypeInfo注解将类型信息包括在JSON字符串中的"type"字段中。在反序列化过程中,根据"type"字段的值来决定具体的子类类型。

相关推荐
hqxstudying7 分钟前
Java向量化
java·开发语言
●VON42 分钟前
重生之我在暑假学习微服务第七天《微服务之服务治理篇》
java·学习·微服务·云原生·nacos·架构·springcloud
你知道烟火吗1 小时前
谈谈对反射的理解?
java·开发语言·spring boot·后端
我爱996!1 小时前
Spring IoC&DI
java·后端·spring
啊阿狸不会拉杆1 小时前
《Java 程序设计》核心知识点梳理与深入探究
java·开发语言·python·算法·php·intellij-idea
盖世英雄酱581362 小时前
事务报错,为何数据还是插入成功了❓
java·数据库·后端
it自2 小时前
Redisson在Spring Boot项目中的集成与实战
java·spring boot·redis·后端·缓存
一勺-_-2 小时前
全栈:怎么把IDEA和Maven集成一下?
java·maven·intellij-idea
燕山石头2 小时前
解决 IntelliJ IDEA Build时 Lombok 不生效问题
java·前端·intellij-idea
Asu52022 小时前
链表反转中最常用的方法————三指针法
java·数据结构·学习·链表