web-dev-qa-db-ja.com

Gson.fromJson()を使用してArrayList <ArrayList <String >>を取得することは可能ですか?

配列のjson配列があるとしましょう

_String jsonString = [["John","25"],["Peter","37"]];
_

これを_ArrayList<ArrayList<String>>_オブジェクトにパースしたいと思います。私が使用したとき

Gson.fromJson(jsonString,ArrayList<ArrayList<String>>.class)

それは動作していないようで、私は使用して回避策をしました

Gson.fromJson(jsonString,String[][].class)

これを行うためのより良い方法はありますか?

はい、 TypeToken を使用します。

_ArrayList<ArrayList<String>> list = gson.fromJson(jsonString, new TypeToken<ArrayList<ArrayList<String>>>() {}.getType());
_

TypeTokenを使用すると、実際に必要なジェネリック型を指定できます。これにより、Gsonは逆シリアル化中に使用する型を見つけることができます。

このgem: Class#getGenericSuperClass() を使用します。それが匿名クラスであるという事実は、それを_TypeToken<...>_のサブクラスにします。次のようなクラスと同等です

_class Anonymous extends TypeToken<...>
_

メソッドの仕様では、

スーパークラスがパラメーター化された型である場合、返されるTypeオブジェクトは、ソースコードで使用される実際の型パラメーターを正確に反映する必要があります。

指定した場合

_new TypeToken<String>(){}.getType();
_

返されるTypeオブジェクトは、実際にはParameterizedTypeになり、 ParameterizedType#getActualTypeArguments() を使用して実際の型引数を取得できます。

Type引数は、上記の例の_Java.lang.String_のTypeオブジェクトになります。あなたの例では、それは_ArrayList<ArrayList<String>>_に対応するTypeオブジェクトになります。 Gsonは、必要な型の完全なマップを作成するまでチェーンを続けていきます。

67