首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

GSON多态反序列化无法使用RuntimeTypeAdapterFactory反序列化“Type`属性

GSON是Google提供的一个用于Java对象和JSON数据之间相互转换的库。在GSON中,多态反序列化是指将JSON数据转换为Java对象时,根据JSON数据中的特定属性值来确定具体的Java对象类型。

在使用GSON进行多态反序列化时,如果要使用RuntimeTypeAdapterFactory来反序列化包含"Type"属性的JSON数据,可能会遇到无法正常反序列化的问题。RuntimeTypeAdapterFactory是GSON库中的一个工厂类,用于根据特定属性值来确定具体的Java对象类型。

解决这个问题的方法是,首先需要创建一个自定义的TypeAdapterFactory,用于处理多态反序列化。然后,在自定义的TypeAdapterFactory中,根据JSON数据中的"Type"属性值来确定具体的Java对象类型,并进行相应的反序列化操作。

以下是一个示例代码,演示了如何使用自定义的TypeAdapterFactory来解决GSON多态反序列化无法使用RuntimeTypeAdapterFactory反序列化"Type"属性的问题:

代码语言:txt
复制
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.TypeAdapter;
import com.google.gson.TypeAdapterFactory;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;

import java.io.IOException;

public class PolymorphicDeserializerExample {
    public static void main(String[] args) {
        Gson gson = new GsonBuilder()
                .registerTypeAdapterFactory(new CustomTypeAdapterFactory())
                .create();

        String json = "{\"Type\":\"Dog\",\"name\":\"Max\",\"age\":3}";
        Animal animal = gson.fromJson(json, Animal.class);
        System.out.println(animal);
    }

    // 自定义的TypeAdapterFactory
    static class CustomTypeAdapterFactory implements TypeAdapterFactory {
        @Override
        public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
            if (type.getRawType() == Animal.class) {
                return (TypeAdapter<T>) new AnimalTypeAdapter(gson);
            }
            return null;
        }
    }

    // 自定义的TypeAdapter
    static class AnimalTypeAdapter extends TypeAdapter<Animal> {
        private Gson gson;

        public AnimalTypeAdapter(Gson gson) {
            this.gson = gson;
        }

        @Override
        public void write(JsonWriter out, Animal value) throws IOException {
            // 不需要实现
        }

        @Override
        public Animal read(JsonReader in) throws IOException {
            in.beginObject();
            String type = null;
            while (in.hasNext()) {
                String name = in.nextName();
                if (name.equals("Type")) {
                    type = in.nextString();
                } else {
                    in.skipValue();
                }
            }
            in.endObject();

            if (type != null) {
                switch (type) {
                    case "Dog":
                        return gson.fromJson(in, Dog.class);
                    case "Cat":
                        return gson.fromJson(in, Cat.class);
                    // 可以根据具体的需求添加其他类型
                }
            }

            return null;
        }
    }

    // Animal类及其子类
    static class Animal {
        // 公共属性
        String name;
        int age;

        @Override
        public String toString() {
            return "Animal{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }

    static class Dog extends Animal {
        // Dog特有属性
        String breed;

        @Override
        public String toString() {
            return "Dog{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", breed='" + breed + '\'' +
                    '}';
        }
    }

    static class Cat extends Animal {
        // Cat特有属性
        String color;

        @Override
        public String toString() {
            return "Cat{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", color='" + color + '\'' +
                    '}';
        }
    }
}

在上述示例代码中,我们首先创建了一个自定义的TypeAdapterFactory(CustomTypeAdapterFactory),用于处理Animal类的多态反序列化。然后,我们创建了一个自定义的TypeAdapter(AnimalTypeAdapter),在其中根据JSON数据中的"Type"属性值来确定具体的Java对象类型,并进行相应的反序列化操作。

最后,我们使用GSON的registerTypeAdapterFactory方法将自定义的TypeAdapterFactory注册到GSON实例中,然后使用fromJson方法将JSON数据转换为Animal对象。

需要注意的是,上述示例代码中的Animal类及其子类(Dog和Cat)是为了演示目的而创建的简单类,实际使用时需要根据具体的需求进行相应的定义。

希望以上内容能够帮助到您!如果有任何疑问,请随时提问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

除了FastJson,你还有选择: Gson简易指南

这个周末被几个技术博主的同一篇公众号文章 fastjson又被发现漏洞,这次危害可导致服务瘫痪! 刷屏,离之前的漏洞事件没多久,FastJson 又出现严重 Bug。目前项目中不少使用了 FastJson 做对象与JSON数据的转换,又需要更新版本重新部署,可以说是费时费力。与此同时,也带给我新的思考,面对大量功能强大的开源库,我们不能盲目地引入到项目之中,众多开源框架中任一个不稳定因素就足以让一个项目遭受灭顶之灾。趁着周末,在家学习下同样具备对象JSON相互转换功能的优秀开源框架 Gson,并且打算将今后项目使用 FastJson 的地方逐渐换成使用 Gson,记录下学习总结的内容,希望对小伙伴也有所帮助。

03

除了FastJson,你还有选择: Gson简易指南

前几天被几个技术博主的同一篇公众号文章 fastjson又被发现漏洞,这次危害可导致服务瘫痪! 刷屏,离之前漏洞事件没多久,fastjson 又出现严重 Bug。目前项目中不少使用了 fastjson 做对象与JSON数据的转换,又需要更新版本重新部署,可以说是费时费力。与此同时,也带给我新的思考,面对大量功能强大的开源库,我们不能盲目地引入到项目之中,众多开源框架中某个不稳定因素就足以让一个项目遭受灭顶之灾。趁着周末,在家学习下同样具备JSON与对象转换功能的优秀开源框架 Gson,并且打算将今后项目使用 fastjson 的地方逐渐换成使用 Gson,记录下学习总结的内容,希望对小伙伴也有所帮助。

04
领券