java - 使用自定义 TypeSelector 使用 Gson on Fire 反序列化 Json

标签 java generics gson

我有 3 种不同类型的 json。我想根据 json 本身内部的字段将它们反序列化为对象。

我选择 Gson on Fire 来完成此任务 github 。 有一个 TypeSelector 的示例非常符合我的需求。

所以我写道:

public static Base buildFromJson(String json) {
    GsonFireBuilder builder = new GsonFireBuilder().registerTypeSelector(Base.class, new TypeSelector<Base>() {
        @Override
        public Class<? extends Base> getClassForElement(JsonElement jsonElement) {
            String type = jsonElement.getAsJsonObject().get("typ").getAsString();
            if (Type.A.toString().equalsIgnoreCase(type)) { return A.class; }
            else if (Type.B.toString().equalsIgnoreCase(type)) { return B.class; }
            else if (Type.C.toString().equalsIgnoreCase(type)) { return C.class; }
            else { return null; }
        }
    });
Gson gson = builder.createGson();
//...
}

但我被困在这里了。我需要知道如何返回 ABC 的实例。 gson 采用 gson.fromJson(json, Base.class); 来应用自定义 TypeSelector。 但我无法弄清楚如何返回所需的实例。

最佳答案

typ”应该是您的基类的属性。所以我们应该能够以这种方式获得所需的实例:

GsonFireBuilder builder = new GsonFireBuilder()
        .registerTypeSelector(Base.class, new TypeSelector<Base>() {
            @Override
            public Class<? extends Base> getClassForElement(JsonElement readElement) {
                String typ = readElement.getAsJsonObject().get("typ").getAsString();
                if("a".equals(typ)){
                    return A.class;
                } else if("b".equals(typ)) {
                    return B.class;
                } else { //"base".equals(typ)
                    return Base.class;
                }
            }
        });

    Gson gson = builder.createGson();

    A a = new A();
    a.typ = "a";

    B b = new B();
    b.typ = "b";

    Base base = new Base();
    base.typ = "base";

    String jsona = gson.toJson(a);
    String jsonb = gson.toJson(b);
    String jsonbase = gson.toJson(base);

    Base ba = gson.fromJson(jsona, Base.class); // ^ returns A
    Base bb = gson.fromJson(jsonb, Base.class); // ^ returns B
    Base bbase = gson.fromJson(jsonbase, Base.class); // ^ returns Base

您可以在 github 上找到更多示例

关于java - 使用自定义 TypeSelector 使用 Gson on Fire 反序列化 Json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24785695/

相关文章:

java - 无法使 json 对 recyclerview 有效

java - Java 中的内存分配加倍

arrays - Swift:在扩展中声明一个类型的数组符合协议(protocol)

ios - 我想要一个用于核心数据的通用 fetchedResultsController 来支持多个模型

Java 使用泛型对集合进行排序

java - 使用 Key 和 Value 都是用户定义对象时的 Gson 转换问题

java - 与单生产者模式相比,lmax disruptor 在多生产者模式下太慢

java - 服务内的广播接收器不工作

java - OpenGL - 特定深度的像素颜色

JavaScript 和 Json : Excluding Fields From Serialization and Deserialization