Islands in the byte stream

Technical notes by a software engineer

Gson.fromJson()でList<T>を返すユーティリティをどうやって定義するか

google/gson

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