Java
 Computer >> コンピューター >  >> プログラミング >> Java

【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変換処理を実現できます。

  1. JavaのJToggleButton実装ガイド:ON/OFF切替ボタンの作り方を解説

    JToggleButtonとは JToggleButtonはAbstractButtonを拡張したクラスで、クリックするたびにONとOFFが切り替わるトグルボタンを実現するために使用されます。通常のボタンと異なり、押した状態を保持できるのが特徴です。 JToggleButtonの主な特徴 最初に押されたときは押し込まれた状態のままとなり、もう一度押してはじめて元の状態(押されていない状態)に戻ります。 ボタンが押されるたびにActionEventが発生します。 さらに、JToggleButtonはItemEventも発生させることができます。このイベントは、選択状態という概念を持つコンポー

  2. JavaでJSONをパース(解析)する方法|org.json・Gson・JsonPathの使い方を解説

    このチュートリアルでは、JavaでJSONを解析(パース)する方法を、複数のライブラリの使い方とあわせて解説します。 JSONとは「JavaScript Object Notation」の略称で、JavaScriptのサブセットをベースとした軽量なデータ形式です。 データ交換フォーマットとして広く普及しており、Webプログラミングにおいて不可欠な技術となっています。本記事では、org.jsonライブラリを使ったJSONのパース方法を中心に紹介します。 まず基本をおさらいしましょう。JSONオブジェクトは「キーと値のペア」から構成される順序のない集合です。一方、JSON配列は値が順序付けて格納さ