我有 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();
//...
}
但我被困在这里了。我需要知道如何返回 A
、B
或 C
的实例。
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/