将Type传递给方法并更改响应

时间:2014-11-17 13:33:15

标签: java json gson

我从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就没有办法吗?

1 个答案:

答案 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声明之类的东西)

希望这会有所帮助