2012-02-16 15 views
0

マップに変換できるJSONを返すサービスで作業しています(私はgoogle-gsonを使って変換しています)。私はこのマップから値のセットを取得する必要があります。 まず、私は次の構造を持っていた:ジェネリックでの呼び出しメソッド

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のパラメータ化された型だけです。

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(); 
} 

しかし、今、私は適切な方法でこのメソッドを呼び出す方法こだわっている:だから、私は、JSONからutilのメソッドに設定して得る移動することを決めました。何かのように

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

ありがとうございます。

答えて

1

おそらく最も簡単なのは、typeのタイプをTypeに変更し、new TypeToken<Map<String, ProfileShow>>() { }.getType()またはそれに類するものを渡すことです。

私が本当に欲しかったのであれば、ParameterizedTypeを構築できると思います。

関連する問題