我有一个返回 JSON 的 Api。响应采用某种格式,可以放入名为 ApiResult 的对象中,并包含Context <T>
和一个 int 代码。
ApiResult 以通用方式声明,例如ApiResult<SomeObject>
我想知道如何让 GSON 将传入的 JSON 字符串转换为ApiResult<T>
到目前为止我有:
Type apiResultType = new TypeToken<ApiResult<T>>() { }.getType();
ApiResult<T> result = gson.fromJson(json, apiResultType);
但这仍然返回将 Context 转换为 LinkedHashMap (我认为它是 GSON 回退到的)
你必须知道 T 将会是什么。传入的 JSON 基本上只是文本。 GSON 不知道你希望它成为什么对象。如果您可以根据该 JSON 中的某些内容来创建 T 实例,则可以执行以下操作:
public static class MyJsonAdapter<X> implements JsonDeserializer<ApiResult<X>>
{
public ApiResult<X> deserialize( JsonElement jsonElement, Type type, JsonDeserializationContext context )
throws JsonParseException
{
String className = jsonElement.getAsJsonObject().get( "_class" ).getAsString();
try
{
X myThing = context.deserialize( jsonElement, Class.forName( className ) );
return new ApiResult<>(myThing);
}
catch ( ClassNotFoundException e )
{
throw new RuntimeException( e );
}
}
}
我使用字段“_class”来决定我的 X 需要是什么,并通过反射实例化它(类似于 PomPom 的示例)。您可能没有如此明显的字段,但必须有某种方法让您查看 JsonElement 并根据它的内容决定它应该是什么类型的 X。
这段代码是我不久前使用 GSON 所做的类似代码的黑客版本,请参阅第 184+ 行:https://github.com/chriskessel/MyHex/blob/master/src/kessel/hex/domain/GameItem.java https://github.com/chriskessel/MyHex/blob/master/src/kessel/hex/domain/GameItem.java
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)