我有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();
//...
}
但在这里我被困住了。我需要知道如何返回A
,B
或C
的实例。
gson
需要gson.fromJson(json, Base.class);
应用自定义TypeSelector的位置。
但我无法弄清楚如何返回所需的实例。
答案 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
上找到更多示例