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

相关推荐
用户37215742613520 分钟前
Java 实现 Excel 与 TXT 文本高效互转
java
浮游本尊1 小时前
Java学习第22天 - 云原生与容器化
java
渣哥3 小时前
原来 Java 里线程安全集合有这么多种
java
间彧3 小时前
Spring Boot集成Spring Security完整指南
java
间彧4 小时前
Spring Secutiy基本原理及工作流程
java
Java水解5 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
洛小豆7 小时前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试
前端小张同学7 小时前
服务器上如何搭建jenkins 服务CI/CD😎😎
java·后端
ytadpole7 小时前
Spring Cloud Gateway:一次不规范 URL 引发的路由转发404问题排查
java·后端
华仔啊7 小时前
基于 RuoYi-Vue 轻松实现单用户登录功能,亲测有效
java·vue.js·后端