【Java入門】GsonでカスタムJSONシリアライザーを実装する方法
カスタムシリアライズとは
Gsonライブラリでは、JavaオブジェクトをJSONに変換する際に、デフォルトの変換ルールではなく独自の変換ロジックを適用したいケースがあります。たとえば、パスワードのマスキング、日付フォーマットの統一、特定フィールドの出力制御などが代表的な例です。
このような場合には、GsonBuilderに対してカスタムシリアライザーを登録することで対応できます。カスタムシリアライザーは、com.google.gson.JsonSerializerインターフェースのserialize()メソッドをオーバーライドして作成します。
実装例
以下は、Studentクラス(学生情報)をJSONに変換する際に、Passwordクラス(パスワード)に対して独自のシリアライズ処理を適用するサンプルコードです。
import java.lang.reflect.Type;
import com.google.gson.*;
public class CustomJSONSerializerTest {
public static void main(String[] args) {
// Password型に対してカスタムシリアライザーを登録
Gson gson = new GsonBuilder()
.registerTypeAdapter(Password.class, new PasswordSerializer())
.setPrettyPrinting()
.create();
Student student = new Student("Adithya", "Jai", 25, "Chennai");
student.setPassword(new Password("admin@123"));
System.out.println(gson.toJson(student));
}
}
// カスタムシリアライザー:Password型の変換処理を定義
class PasswordSerializer implements JsonSerializer<Password> {
@Override
public JsonElement serialize(Password src, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(new StringBuffer(src.getPassword()).toString());
}
}
// Studentクラス
class Student {
private String firstName;
private String lastName;
private int age;
private String address;
private Password password;
public Student(String firstName, String lastName, int age, String address) {
super();
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
this.address = address;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Password getPassword() {
return password;
}
public void setPassword(Password password) {
this.password = password;
}
public String toString() {
return "Student[ " +
"firstName = " + firstName +
", lastName = " + lastName +
", age = " + age +
", address = " + address +
" ]";
}
}
// Passwordクlass
class Password {
private String password;
public Password(String password) {
super();
this.password = password;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}出力結果
{
"firstName": "Adithya",
"lastName": "Jai",
"age": 25,
"address": "Chennai",
"password": "admin@123"
}コードのポイント解説
1. registerTypeAdapter() での登録
GsonBuilder.registerTypeAdapter()メソッドを使用すると、特定の型(ここではPasswordクラス)に対して専用のシリアライザーを紐づけられます。これにより、gson.toJson()の実行時に自動的にカスタム処理が呼び出されます。
2. serialize() メソッドのオーバーライド
JsonSerializerインターフェースのserialize()メソッド内で、オブジェクトをどのようなJsonElementとして出力するかを定義します。戻り値としてJsonPrimitive、JsonObject、JsonArrayなどを返すことができます。
3. ジェネリクスによる型安全性
サンプルではJsonSerializer<Password>のようにジェネリクスを指定しています。これにより、対象の型が明確になり、コンパイル時の型チェックが有効になります。
応用例
実際の開発では、以下のような用途でカスタムシリアライズが活用されます。
- 機密情報(パスワードやトークンなど)をマスキングして出力する
- Date型を「yyyy-MM-dd」などの指定フォーマットの文字列に変換する
- nullフィールドを除外したり、別名のキー名で出力したりする
- 列挙型(enum)を数値コードや表示名に変換する
このように、Gsonのカスタムシリアライザーを使いこなすことで、柔軟かつ安全なJSON変換処理を実現できます。
-
JavaのJToggleButton実装ガイド:ON/OFF切替ボタンの作り方を解説
JToggleButtonとは JToggleButtonはAbstractButtonを拡張したクラスで、クリックするたびにONとOFFが切り替わるトグルボタンを実現するために使用されます。通常のボタンと異なり、押した状態を保持できるのが特徴です。 JToggleButtonの主な特徴 最初に押されたときは押し込まれた状態のままとなり、もう一度押してはじめて元の状態(押されていない状態)に戻ります。 ボタンが押されるたびにActionEventが発生します。 さらに、JToggleButtonはItemEventも発生させることができます。このイベントは、選択状態という概念を持つコンポー
-
JavaでJSONをパース(解析)する方法|org.json・Gson・JsonPathの使い方を解説
このチュートリアルでは、JavaでJSONを解析(パース)する方法を、複数のライブラリの使い方とあわせて解説します。 JSONとは「JavaScript Object Notation」の略称で、JavaScriptのサブセットをベースとした軽量なデータ形式です。 データ交換フォーマットとして広く普及しており、Webプログラミングにおいて不可欠な技術となっています。本記事では、org.jsonライブラリを使ったJSONのパース方法を中心に紹介します。 まず基本をおさらいしましょう。JSONオブジェクトは「キーと値のペア」から構成される順序のない集合です。一方、JSON配列は値が順序付けて格納さ