gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:45:02 25 4
gpt4 key购买 nike

我有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com