20

サービスからJSONを読み取るためのメソッドがあり、Gsonを使用してシリアル化を行い、型パラメーターを使用して次のメソッドを記述しました。

public T getDeserializedJSON(Class<T> aClass,String url)
{
    Reader r = getJSONDataAsReader(url);
    Gson gson = new Gson();
    return gson.fromJson(r, aClass);
}

私はタイプの配列だけを返すjsonを消費しています。

[
 { "prop":"value" }
 { "prop":"value" }
]

このオブジェクトにマップするJavaクラスがあります。これをMyClassと呼びましょう。ただし、私の方法を使用するには、これを行う必要があります。

RestClient<ArrayList<MyClass>> restClient = new RestClient<ArrayList<MyClass>>();
ArrayList<MyClass> results = restClient.getDeserializedJSON(ArrayList<MyClass>.class, url);

しかし、それを行うための構文がわかりません。ArrayList.classだけを渡すことは機能しません。

では、Classパラメーターを削除する方法や、MyClassのArrayListのクラスを取得する方法はありますか?

4

6 に答える 6

33

Bozhoのソリューションを使用するか、次を使用して一時配列リストの作成を回避できます。

Class<List<MyClass>> clazz = (Class) List.class;

このソリューションの唯一の問題は、チェックされていない警告をで抑制しなければならないことです@SuppressWarnings("unchecked")

于 2010-05-09T15:00:33.350 に答える
10

できません。安全でないキャストを使用する必要があります:

Class<List<MyClass>> clazz = 
   (Class<List<MyClass>>) new ArrayList<MyClass>().getClass();
于 2010-05-09T14:27:10.700 に答える
7

これのフォローアップとして、私はこれをGsonのドキュメントで見つけました。

Type listType = new TypeToken<List<String>>() {}.getType();

これはタイプを安全に取得する問題を解決しますが、TypeTokenクラスはGsonに固有です。

于 2010-05-09T15:51:03.810 に答える
1

使用している場合は 、次のようにSpringFramework使用できます。ParameterizedTypeReference

 restClient.getDeserializedJSON(ParameterizedTypeReference<List<MyClass>>(){},url);
于 2019-11-26T20:47:49.297 に答える
0

同様のシナリオがありましたが、ArrayListの代わりに配列を使用するための回避策があります

MyClass[] results = restClient.getDeserializedJSON(MyClass[].class, url);

そしてここでdeserializeメソッドは何をしますか

その後、次のようにリストを進めることができます。

List<MyClass> r_results= Arrays.stream(results).collect(Collectors.toList());
于 2021-01-08T12:03:50.007 に答える
0

要件によって異なりますが、配列を使用して問題がない場合は、クラスとして提供できます。MyClass[].class

于 2021-02-04T11:57:16.320 に答える