Java GSON - 使用泛型类型列表序列化和反序列化类

标签 java list generics gson deserialization

示例类:

public class A
{
    String Name;
    List<B> GenericsList;

    //Getters & Setters & Constructors
}

public class B
{
   String Title;
   //Getters & Setters & Constructors
}

public class C extends B
{
    String Something;
    //Getters & Setters & Constructors
}

如果我像这样序列化 A 类的实例:

List<B> bList = new ArrayList<>();
C bObj = new C("name", "something text");
bList.add(bObj);

A aObj = new A("name", bList);

String serialized = new Gson.toJson(aObj);

A deserializedA = new Gson.fromJson(serialized);

我丢失了列表中的 C 子类型。 如果它只是一个像这样序列化的列表,我知道如何解决这个问题:

Gson gson = new Gson();
List<B> bList = new ArrayList<>();

Type bType = new TypeToken<List<B>>() {}.getType();
gson.toJson(bList, bType);

gson.fromJson(json, bType);

问题是我的泛型列表位于具有其他参数的对象内。我该怎么做?

编辑1: 可能是我没说清楚具体问题。

当我序列化和反序列化上面创建的 A 对象时,没有错误,但没有得到这个: 对象A: 姓名=“姓名” GenericsList = {对象 C}

我得到: 对象A: 姓名=“姓名” 泛型列表 = {对象 B}

我丢失了 C 亚型详细信息。

最佳答案

明白了!感谢 Sotirios Delimanolis 的提示!

必须为 B 类创建自定义实现:

class BGsonAdapter implements JsonSerializer<B>, JsonDeserializer<B>
{
    public JsonElement serialize(B bObj, Type typeOfSrc, JsonSerializationContext context)
    {
        JsonObject result = new JsonObject();
        result.add("Title", context.serialize(B.getTitle(), String.class));

        if (bObj instanceof C)
        {
            result.add("Something", context.serialize(((C)bObj).getSomething(), String.class));
        }

        return result;
    }

    public B deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException
    {
        JsonObject object = json.getAsJsonObject();
        B result = null;

        if (object.has("Something"))
        {
            result = new C();
            ((C) result).setSomething((String)context.deserialize(object.get("Something"), String.class));

        if (result == null)
        {
            result = new B();
        }
        result.setTitle(((String)context.deserialize(object.get("Title"), String.class)));

        return result;
    }
}

并像这样使用它:

Gson gson = new GsonBuilder()
            .registerTypeHierarchyAdapter(B.class, new BGsonAdapter())
            .setPrettyPrinting()
            .create();

String serialized = gson.toJson(A);

A deserialized = (A)gson.fromJson(A);

关于Java GSON - 使用泛型类型列表序列化和反序列化类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28814573/

相关文章:

java - 如何创建本地存储库以使用 Eclipse?

python - 如何在 Networkx Python 中添加带有列表作为标签的边

java - 未经检查的覆盖(好吧,我似乎需要我的泛型方法)

java - 在现有分析之前注入(inject) Sonar 分析

java - 如何使JFrame透明?

python - 按顺序遍历列表的每个值,从随机值开始

java - 从泛型类派生的类没有获得正确的类型

java - 未经检查的转换 : 'java.lang.Object[]' to 'T[]'

java - Proguard: `NoSuchFieldError`,尽管字段位于 `seeds.txt`

java - 检查数组中同一对象的多个实例