GsonでJSON配列をJavaのジェネリック型Listにデシリアライズする方法
Gsonライブラリには、ジェネリック型の情報を保持するための com.google.gson.reflect.TypeToken クラスが用意されています。TypeToken を継承した匿名サブクラスを作成して対象のクラス型を指定することで、Gson はジェネリッククラスに渡された実際の型を正しく認識できるようになります。
構文
public class TypeToken<T> extends Object
Java の型消去(Type Erasure)の仕様上、実行時にはジェネリック型のパラメータ情報が失われます。しかし、TypeToken を使えば匿名サブクラス経由でその型情報を実行時に取得でき、JSON配列を特定のオブジェクト型のリストへ安全にマッピングできます。
以下の例では、JSON文字列を List<Student> 型にデシリアライズしています。
コード例
import java.lang.reflect.Type;
import java.util.*;
import com.google.gson.*;
import com.google.gson.reflect.*;
public class JSONArrayToListTest {
public static void main(String args[]) throws Exception {
String jsonStr = "[{\"name\":\"Adithya\", \"course\":\"Java\"},"
+ "{\"name\":\"Ravi\", \"course\":\"Python\"}]";
// TypeTokenでList<Student>の型情報を取得
Type listType = new TypeToken<ArrayList<Student>>() {}.getType();
List<Student> students = new Gson().fromJson(jsonStr, listType);
System.out.println(students);
}
}
// Studentクラス
class Student {
String name;
String course;
@Override
public String toString() {
return "Student [name=" + name + ", course=" + course + "]";
}
}
実行結果
[Student [name=Adithya, course=Java], Student [name=Ravi, course=Python]]
ポイントまとめ
- TypeToken<ArrayList<Student>>() {} のように、波括弧付きで匿名サブクラスを生成することが重要です。
getType()メソッドで完全なジェネリック型情報(ParameterizedType)を取得します。- 取得した型情報を
Gson().fromJson()の第二引数に渡すことで、JSON配列が Student オブジェクトのリストとして復元されます。 - 単純に
List.classを指定した場合、要素が Student ではなく LinkedTreeMap になってしまうため注意が必要です。
-
JavaでJSON配列を作成する方法をわかりやすく解説
JSON配列とは、角括弧で囲まれた値の順序付きコレクションのことです。具体的には「[」で始まり「]」で終わり、配列内の各値はカンマ(,)で区切られます。JSON配列のサンプル{ books: [Java, JavaFX, Hbase, Cassandra, WebGL, JOGL] }json-simpleは、JSONオブジェクトを処理するための軽量ライブラリです。このライブラリを使えば、JavaプログラムからJSONドキュメントの内容を読み取ったり、書き込んだりすることができます。json-simpleのMaven依存関係json-simpleライブラリを使用するには、まずpom.x
-
JavaでList(リスト)を配列に変換する方法|toArray()とArrays.asList()の使い方
Javaの開発において、List(リスト)と配列(Array)の相互変換は非常によく使われる基本的な操作です。 Listを配列に変換する最も簡単かつ推奨される方法は、.toArray()メソッドを使うことです。逆に、配列をListに戻したい場合は、Arrays.asList()メソッドを使用します。 以下では、文字列(String)のListや整数(Integer)のListを、それぞれ対応する配列に変換する具体例を紹介します。 String型のListを配列に変換する import java.util.ArrayList; import java.util.List; public cl