【Java入門】Gsonの@JsonAdapterアノテーションでカスタムJsonAdapterを実装する方法
JavaでJSON処理を行う際に広く使われているGsonライブラリでは、@JsonAdapterアノテーションを使うことで、独自の変換ロジックを持つカスタムアダプターを簡単に組み込むことができます。このアノテーションは、フィールド単位またはクラス単位で指定でき、特定のプロパティだけシリアライズの形式を変えたい場合に特に便利です。
@JsonAdapterとTypeAdapterの基本
Gsonはデフォルトで、アプリケーションのクラスをJSONに変換するために組み込みのTypeAdapterを使用します。しかし、出力形式を細かく制御したいケースでは、TypeAdapterクラスを継承したカスタムアダプターを作成し、デフォルトの動作をオーバーライドできます。TypeAdapterは、JavaオブジェクトからJSONへの書き込み(write)と、JSONからJavaオブジェクトへの読み込み(read)の両方向の変換を担います。
構文
@Retention(value=RUNTIME)
@Target(value={TYPE,FIELD})
public @interface JsonAdapter実装例
以下の例では、CustomerクラスのcustomerIdフィールドに@JsonAdapterアノテーションを付与し、数値をネストされたオブジェクト形式で出力するカスタムアダプターを適用しています。
import java.io.IOException;
import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.google.gson.annotations.JsonAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
public class JsonAdapterTest {
public static void main(String[] args) {
Gson gson = new Gson();
System.out.println(gson.toJson(new Customer()));
}
}
// Customerクラス
class Customer {
@JsonAdapter(CustomJsonAdapter.class)
Integer customerId = 101;
}
// カスタムアダプタークラス
class CustomJsonAdapter extends TypeAdapter<Integer> {
// JSONからJavaオブジェクトへの読み込み
@Override
public Integer read(JsonReader jreader) throws IOException {
return null;
}
// JavaオブジェクトからJSONへの書き込み
@Override
public void write(JsonWriter jwriter, Integer customerId) throws IOException {
jwriter.beginObject();
jwriter.name("customerId");
jwriter.value(String.valueOf(customerId));
jwriter.endObject();
}
}実行結果
{"customerId":{"customerId":"101"}}コードの解説
- writeメソッド: beginObject()でJSONオブジェクトの開始を宣言し、name()でキー名を指定した後、value()に値を文字列として設定しています。
- readメソッド: 逆シリアル化(JSON→Java)が必要な場合は、JsonReaderから値を読み取ってIntegerとして返す処理を実装します。
- 適用範囲: @JsonAdapterはフィールドだけでなくクラスレベルにも指定できるため、クラス全体の変換ルールをまとめて定義することも可能です。
このようにTypeAdapterを継承してカスタムアダプターを作成すれば、日付フォーマットの変更やnull値の扱い、API仕様に合わせた特殊な構造の出力など、柔軟なJSON変換が実現できます。
-
JavaのGregorianCalendarクラスで日付を出力する方法
```html GregorianCalendarクラスとはJavaのGregorianCalendarクラスは、標準的な暦体系をサポートするjava.utilパッケージのカレンダークラスで、ユリウス暦とグレゴリオ暦の両方に対応しています。GregorianCalendarのオブジェクトは、複数用意されたコンストラクタのいずれか、またはgetInstance()メソッドを使って生成できます。以下では、このクラスを使って日付を出力するさまざまな方法を具体例とともに解説します。例1:年・月・日を指定してインスタンスを生成する次の例では、コンストラクタに年・月・日の値を引数として渡し、Gregori
-
Java 9でJavaFXを使ってJShellをプログラムから実装する方法
JShellは、サンプル式を対話的に実行できるツールです。通常はコマンドラインから利用しますが、JavaFXアプリケーションの中でプログラム的にJShellを実装することも可能です。その場合、Javaプログラムに以下のパッケージをインポートする必要があります。import jdk.jshell.JShell; import jdk.jshell.SnippetEvent; import jdk.jshell.VarSnippet;これらのクラスの役割は次のとおりです。JShell:評価エンジンの本体。式や文を評価(eval)するためのAPIを提供します。SnippetEvent:評価結果として