61

GSON で行うオブジェクトのリストを取得するには

Gson gson = new Gson();
Type token = new TypeToken<List<MyType>>(){}.getType();
return gson.fromJson(json, token);

それはうまく機能しますが、さらに進んでMyTypeをパラメータ化したいので、このコードでオブジェクトのリストを解析する共通の関数を使用できます

// the common function 
public <T> List<T> fromJSonList(String json, Class<T> type) {
  Gson gson = new Gson();
  Type collectionType = new TypeToken<List<T>>(){}.getType();
  return gson.fromJson(json, collectionType);
}

// the call
List<MyType> myTypes = parser.fromJSonList(jsonString, MyType.class);

悲しいことに、型ではなく StringMaps の配列を返します。T は、私の型ではなく、別のジェネリック型として解釈されています。回避策はありますか?

4

13 に答える 13

29
public static final <T> List<T> getList(final Class<T[]> clazz, final String json)
{
    final T[] jsonToObject = new Gson().fromJson(json, clazz);

    return Arrays.asList(jsonToObject);
}

例:

getList(MyClass[].class, "[{...}]");
于 2015-03-02T08:12:20.813 に答える
6

私はRaffaele のアプローチをさらに一歩進めてクラスを一般化したので、すべてのクラス A (B はパラメーター化されていないクラス) で機能します。セットやその他のコレクションに役立つ場合があります。

    public class GenericOf<X, Y> implements ParameterizedType {

    private final Class<X> container;
    private final Class<Y> wrapped;

    public GenericOf(Class<X> container, Class<Y> wrapped) {
        this.container = container;
        this.wrapped = wrapped;
    }

    public Type[] getActualTypeArguments() {
        return new Type[]{wrapped};
    }

    public Type getRawType() {
        return container;
    }

    public Type getOwnerType() {
        return null;
    }

}
于 2015-03-11T09:27:37.513 に答える
3

これは以前の質問で回答されています。基本的に、2つのオプションがあります。

  1. 呼び出し元のサイトからパスインしTypeます。呼び出し元のコードはTypeToken、それを構築するためにまたは何でも使用します。
  2. パラメータType化されたタイプに対応するものを自分で作成します。これには、実装するクラスを作成する必要がありますParameterizedType
于 2013-01-03T19:53:31.410 に答える