【@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"字段的值来决定具体的子类类型。

相关推荐
wenlonglanying5 分钟前
springboot与springcloud对应版本
java·spring boot·spring cloud
稻草猫.11 分钟前
Spring统一功能处理
java·后端·spring
学不完的23 分钟前
ZrLog 博客系统部署指南(无 War 包版,Maven 构建 + 阿里云镜像优化)
java·linux·nginx·阿里云·maven
小江的记录本25 分钟前
【Java】Java核心关键字:final、static、volatile、synchronized、transient(附《面试高频考点》)
java·开发语言·spring boot·后端·sql·spring·面试
oyzz12034 分钟前
SpringBoot最佳实践之 - 使用AOP记录操作日志
java·spring boot·后端
yang_B62135 分钟前
C# ISerializable 允许对象控制自己的序列化/反序列化过程
java·开发语言·c#
mygljx39 分钟前
oracle 12c查看执行过的sql及当前正在执行的sql
java·sql·oracle
1104.北光c°44 分钟前
Leetcode21.合并两个有序链表 双指针+递归 【hot100算法个人笔记】【java写法】
java·后端·程序人生·算法·leetcode·链表·学习方法
花间相见1 小时前
【JAVA基础14】—— 二维数组详解:从基础到实战应用
java·python·算法
zjjsctcdl1 小时前
Spring Boot 经典九设计模式全览
java·spring boot·设计模式