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

时间:2014-07-16 16:14:55

标签: java generics gson

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

我已选择Gson on Fire执行此任务github。 有一个TypeSelectors的例子非常符合我的需求。

所以我写道:

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的位置。 但我无法弄清楚如何返回所需的实例。

1 个答案:

答案 0 :(得分:1)

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

上找到更多示例