2012-02-16 3 views
0

Я работаю с службой, которая возвращает JSON, который может быть преобразован в Map (я использую google-gson lib для преобразования). Мне нужно получить набор значений с этой Карты. Во-первых, я имел следующую структуру: методМетод вызова с generics

public Set<ProfileShow> getShows() { 
    String json = ...; //getting JSON from service 
    if (!Utils.isEmptyString(json)) { 
     Map<String, ProfileShow> map = Utils.fromJSON(json, new TypeToken<Map<String, ProfileShow>>() { 
     }.getType()); 

     Set<ProfileShow> result = new HashSet<ProfileShow>(); 
     for (String key : map.keySet()) { 
     result.add(map.get(key)); 
     } 
     return result; 
    } 
    return Collections.emptySet(); 
} 

public Set<Episode> getUnwatchedEpisodes() { 
    String json = ...; //getting JSON from service 
    if (!Utils.isEmptyString(json)) { 
     Map<String, Episode> map = Utils.fromJSON(json, new TypeToken<Map<String, Episode>>() { 
     }.getType()); 

     Set<Episode> result = new HashSet<Episode>(); 
     for (String key : map.keySet()) { 
     result.add(map.get(key)); 
     } 
     return result; 
    } 
    return Collections.emptySet(); 
} 

Utils.fromJSON:

public static <T> T fromJSON(String json, Type type) { 
    return new Gson().fromJson(json, type); 
} 

Как вы можете видеть, методы getShows() и getUnwatchedEpisodes() имеет ту же структуру. Единственным отличием является параметризованный тип возвращаемого Set. Итак, я решил перенести получение Набор из JSON в методе Util:

public static <T> Set<T> setFromJSON(String json, T type) { 
    if (!isEmptyString(json)) { 
     Map<String, T> map = fromJSON(json, new TypeToken<Map<String, T>>() { 
     }.getType()); 

     Set<T> result = new HashSet<T>(); 
     for (String key : map.keySet()) { 
     result.add(map.get(key)); 
     } 
     return result; 
    } 
    return Collections.emptySet(); 
} 

Но теперь я застрял, как назвать этот метод надлежащим образом. Что-то вроде

Utils.setFromJSON(json, Episode.class.getGenericSuperclass()); //doesn't work 

Благодарим за помощь.

ответ

1

Возможно, проще всего изменить тип type на номер Type и передать в new TypeToken<Map<String, ProfileShow>>() { }.getType() или аналогичный.

Я думаю, вы могли бы построить ParameterizedType, если хотите.

Смежные вопросы