我有一个返回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福尔斯回退)
5条答案
按热度按时间ncgqoxb01#
你必须知道T是什么。传入的JSON基本上只是文本。JSON不知道你想让它变成什么对象。如果JSON中有什么东西你可以从中找到线索来创建T示例,你可以这样做:
我使用一个字段“_class”来决定我的X需要是什么,并通过反射示例化它(类似于PomPom的例子)。您可能没有这样一个明显的字段,但必须有某种方法来查看JsonElement,并根据它的内容决定它应该是什么类型的X。
这段代码是我不久前对GSON所做的类似工作的一个黑客版本,请参见第184+行:https://github.com/chriskessel/MyHex/blob/master/src/kessel/hex/domain/GameItem.java
myss37ts2#
你必须为Gson提供
T
类型,因为gson不知道应该应用什么适配器,它只返回一个数据结构。您必须提供通用信息,例如:
如果类型T只在运行时才知道,我会使用一些技巧:
您的调用将是(但将
String.class
替换为变量):mum43rcc3#
我的解决方案是使用org.json和Jackson
下面是将json对象 Package 成数组、将对象转换成列表以及将json字符串转换成类型的方法。
qyswt5oh4#
我使用的是JacksonJson库,与GSon非常相似。可以通过以下方式将json字符串转换为某个泛型类型的对象:
也许这是正确的方式与GSON在您的情况:
z4iuyo4d5#
JSON到通用对象
JSON到通用对象列表