2014-11-17 2 views
1

Я получаю JSON от вызова Java, и я хочу проанализировать его на объект с свойством «info», который изменит тип в соответствии с тем, кто сделал вызов.Pass Type to method and alter response

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 

EDIT : Я видел это вопрос с ответом: gson: parametrized fromJson depending on the Type Но разве нет способа сделать, не отправляя TypeToken при вызове метода?

+0

Вы пробовали с помощью класса типа? – user2717954

+0

Вы имеете в виду передачу второго параметра, например «Класс genericType '? – Animaleante

+0

да что-то в этом роде, тогда используйте класс # cast – user2717954

ответ

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, что мы хотим, чтобы вернуть, но 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 (я опустил такие вещи, как попытку поймать или бросает объявление)

надеюсь, что это помогает

+0

Как это похоже, но метод fromJson запрашивает тип класса как второй параметр. И этот вызов getType() (не знаю о «классе », посмотрим на это.) – Animaleante

+0

так передайте c от theJson и внутри него к кастингам – user2717954

+0

Извините, но я не понял, что вы объяснили, или как использовать что вы опубликовали. Не могли бы вы опубликовать более подробный пример? – Animaleante