【问题标题】:Deserialize Json with Gson on Fire with custom TypeSelector使用自定义 TypeSelector 使用 Gson on Fire 反序列化 Json
【发布时间】:2014-07-16 16:14:54
【问题描述】:

我有 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); 应该应用自定义类型选择器的位置。 但我无法弄清楚如何返回所需的实例。

【问题讨论】:

    标签: java generics gson


    【解决方案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 上找到更多示例

    【讨论】:

    • 谢谢你,你确实把我引向了正确的方向。无论我在做什么,我总是得到基础对象。出了问题的是,我曾为不同类型 A、B、C 使用 Enum,但它们被 @SerializedName 覆盖,因此匹配始终默认为 Base.class。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 2017-04-23
    • 2019-03-30
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多