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

相关推荐
Zane199437 分钟前
HashMap 为什么要在长度16、容量必须是2的幂这些细节上较劲
java·后端
长谷深风1111 小时前
为什么你的 Tool 总被模型选错?
java·大数据·ai·llm·ai agent·工具设计·agent设计
莫得感情 o2 小时前
并发 14 · 收官:虚拟线程与结构化并发
java·并发
聚美智数2 小时前
图片水印-图片剪裁-图片缩放API接口介绍
java·服务器·数据库
xierui1231233 小时前
AI Agent 隐私架构:本地化重点为什么是登录态与执行权限
java·人工智能·网络安全·架构
cfm_29143 小时前
Spring AI Tool 调用架构全解
java·人工智能·spring
sun༒3 小时前
Spring @Scheduled 定时任务详解:Cron表达式、执行顺序、优先级与并行调度
java·后端·spring
一次旅行3 小时前
DeepSeek‑V4‑Flash‑Vision‑Exp 小白入门实战|3种传图方式、完整可跑代码、避坑排障
java·前端·人工智能
野生技术架构师4 小时前
Spring Boot 实现数据脱敏:自定义注解 + Jackson 序列化器
java·spring boot·后端
AI人工智能+电脑小能手4 小时前
大白话说Java设计模式-28-模板方法模式(业务实战篇)
java·设计模式·模板方法模式·spring源码·订单系统·代码复用