我从Java调用中接收JSON,并且我想将其解析为具有'info'属性的对象,该属性将根据谁进行调用来更改类型。
public <T> ExternalCallBaseResult<T> parseExternalResultJson(String res)
{
Type collectionType = new TypeToken<ExternalCallBaseResult<T>>(){}.getType();
return Global.gson.fromJson(res, collectionType);
}
我想这样称呼这个方法:
ExternalCallBaseResult<GetUserInfoResult_Info> result = global.parseExternalResultJson(res);
鉴于课程:
public static class ExternalCallBaseResult<T>
{
public int callbackid = 0;
public int success = 1;
public T info = null;
}
我收到了错误:
java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.cht.params.Params$GetUserInfoResult_Info
编辑: 我看到这个问题的答案是:gson: parametrized fromJson depending on the Type 但是如果不必在方法调用上发送TypeToken就没有办法吗?
答案 0 :(得分:1)
我希望我已经理解了你想要实现的目标,当我早些时候评论时,我认为这是别的,但现在我想我明白了, 这样的事情怎么样?
public ExternalCallBaseResult<?> parseExternalResultJson(String res)
{
Class<?> c = Class.forName(getType());
return ExternalCallBaseResult(c.cast(Global.gson.fromJson(res)));
}
编辑: 好吧我不是100%肯定我理解你的意思所以我会尝试举例并告诉我,如果我是对的
说我们有一个班级
class A<T> {
T t;
A(T t) {this.t=t;}
}
我们有一个函数foo,我们希望它返回A但SomeActualType不知道,直到我们从某些json获取它的运行时间
public A<?> foo(String json) {
Class<?> c = Class.forName(getTypeFromJson(json)); //this will load the class of the required type
Object o = parseJson(json); //say this parses the json and returns some object according to it
A a = new A(c.cast(o));
return a;
)
现在foo将返回包含我们从json收到的类型的A(我省略了诸如try catch或throws声明之类的东西)
希望这会有所帮助