JavaのGsonライブラリでジェネリック型をシリアライズ・デシリアライズする方法
Javaでジェネリック型(総称型)のクラスを扱う際、Gsonライブラリを使用してJSONへのシリアライズ(直列化)やデシリアライズ(逆直列化)を行いたいケースはよくあります。しかし、Javaには「型消去(Type Erasure)」という仕組みがあるため、実行時には List<String> のようなジェネリック型のパラメータ情報が失われてしまうという課題があります。
この問題を解決するために、Gsonライブラリでは com.google.gson.reflect.TypeToken クラスが提供されています。TypeToken の匿名サブクラスを作成してクラス型を渡すことで、ジェネリック型の情報を実行時まで保持できます。この型情報をもとに、Gsonはジェネリッククラスに渡された実際のクラス型を認識し、適切な変換処理を行えるようになります。
TypeTokenの構文
public class TypeToken<T> extends java.lang.Object
使用例
以下の例では、List<String> をJSON文字列へ変換した後、TypeToken を使って元のリストへ復元しています。
import java.lang.reflect.Type;
import java.util.*;
import com.google.gson.*;
import com.google.gson.reflect.*;
public class GenericTypesJSONTest {
public static void main(String[] args) {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
List<String> list = Arrays.asList("INDIA", "AUSTRALIA", "ENGLAND", "SOUTH AFRICA");
String jsonStr = gson.toJson(list);
System.out.println(jsonStr);
Type listType = new TypeToken<List<String>>() {}.getType();
list = gson.fromJson(jsonStr, listType);
System.out.println(list);
}
}
実行結果
[
"INDIA",
"AUSTRALIA",
"ENGLAND",
"SOUTH AFRICA"
]
[INDIA, AUSTRALIA, ENGLAND, SOUTH AFRICA]
ポイント解説
new TypeToken<List<String>>() {}のように波括弧{}を付けてインスタンス化すると匿名サブクラスが生成され、スーパークラスの型パラメータ情報がバイトコード上に保持されます。getType()メソッドを呼び出すことで、java.lang.reflect.Typeオブジェクトとしてジェネリック型の完全な型情報を取得できます。- 取得した型情報を
fromJson()に渡すことで、GsonはList<String>として正確にデシリアライズできます。 - 同様の手法は
Map<String, List<Integer>>など、より複雑な入れ子のジェネリック型にも応用可能です。
-
【Java】OpenCVライブラリを使って画像のコントラストを変更する方法
画像の明るさやコントラストの増減は、画像のピクセル値を変換することで実現できます。この変換は、次のような数式で表されます。g(i, j) = α ・ f(i, j) + βここで、各要素の意味は以下のとおりです。(i, j):ピクセルの位置(座標)α(ゲイン)と β(バイアス):変換のパラメータ一般に、ゲインパラメータ α が画像のコントラストを制御し、バイアスパラメータ β が画像の明るさを制御します。convertTo() メソッドについてorg.opencv.core.Mat クラスの convertTo() メソッドを使うと、指定した行列に対して必要な計算を実行し、画像のコントラストや
-
【Java入門】Gsonライブラリを使ってJSON文字列をファイルに書き込む方法
GsonライブラリとはGsonは、JavaオブジェクトをJSON形式に変換(シリアライズ)するためのGoogle製オープンソースライブラリです。逆に、JSON文字列からJavaオブジェクトへの変換(デシリアライズ)も簡単に行えるため、JavaでJSONを扱う際の定番ライブラリとして広く利用されています。Gsonを使用する際の中心的なクラスはGsonクラスです。インスタンスはnew Gson()のように直接生成できますが、設定をカスタマイズしたい場合はGsonBuilderクラスを使ってGsonインスタンスを作成することも可能です。この記事では、Gsonクラスが提供するtoJson()メソッドを