配列の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は、必要な型の完全なマップを作成するまでチェーンを続けていきます。