GsonでList<T>
をデシリアライズするのがけっこう面倒くさくて、以下のようにしなければいけません*1。
Type collectionType = new TypeToken<Collection<Integer>>(){}.getType();
List<Integer> ints2 = gson.fromJson(json, collectionType);
ところが、 List<T>
を意味する Type
型を Class<List<T>>
と Class<T>
から作ることができればハックが不要になるはず!とおもって探したところ、かなりマジカルな方法ながらできるとのこと。
java - Gson TypeToken with dynamic ArrayList item type - Stack Overflow
というわけで以下のようなユーティリティクラスをつくって幸せになりました。 $Gson$Types
はだいぶ怪しいのでGson自体にそういうインターフェイスがあるといいんですけどね。
public class GsonUtils { public static <T> T objectFromJson(String json, Class<T> clazz) { return GsonHolder.GSON.fromJson(json, clazz); } public static <T> List<T> objectsFromJson(String json, Class<T> clazz) { Type type = $Gson$Types.newParameterizedTypeWithOwner(null, ArrayList.class, clazz); return GsonHolder.GSON.fromJson(json, type); } }