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

JavaのGsonでカスタムJSONデシリアライザーを実装する方法を解説

JavaでJSONとオブジェクトを相互変換する際、Gsonライブラリは非常に便利なツールです。標準的な変換だけでなく、GsonBuilderにカスタムデシリアライザー(逆シリアル化処理)を登録することで、JSONからJavaオブジェクトへの変換ロジックを自由に制御できます。

カスタムデシリアライザーを作成するには、com.google.gson.JsonDeserializerインターフェースのdeserialize()メソッドをオーバーライドします。これにより、特定のクラスに対して独自の変換処理を適用できるようになります。

カスタムデシリアライズの実装例

以下の例では、JSON文字列内のパスワードフィールドを専用のPasswordクラスにマッピングするため、カスタムデシリアライザーを実装しています。

import java.lang.reflect.Type;
import com.google.gson.*;

public class CustomJSONDeSerializerTest {
    public static void main(String[] args) {
        Gson gson = new GsonBuilder()
                .registerTypeAdapter(Password.class, new PasswordDeserializer())
                .setPrettyPrinting()
                .create();

        String jsonStr = "{" +
                "\"firstName\": \"Adithya\"," +
                "\"lastName\": \"Sai\"," +
                "\"age\": 25," +
                "\"address\": \"Pune\"," +
                "\"password\": \"admin@123\"" +
                "}";

        Student student = gson.fromJson(jsonStr, Student.class);
        System.out.println(student.getPassword().getPassword());
    }
}

// カスタムデシリアライザー
class PasswordDeserializer implements JsonDeserializer<Password> {
    @Override
    public Password deserialize(JsonElement json, Type typeOfT,
            JsonDeserializationContext context) throws JsonParseException {
        String encryptedPwd = json.getAsString();
        return new Password(new StringBuffer(encryptedPwd).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クラス
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; }
}

実行結果

admin@123

コードのポイント解説

1. registerTypeAdapter()での登録

GsonBuilder.registerTypeAdapter()メソッドを使い、Password.classに対してPasswordDeserializerを関連付けています。これにより、GsonがJSONをStudentオブジェクトへ変換する際、passwordフィールドは自動的にカスタムデシリアライザー経由で処理されます。

2. deserialize()メソッドの実装

deserialize()メソッドでは、引数として渡されるJsonElementから文字列値を取得し(getAsString())、それをもとにPasswordオブジェクトを生成して返しています。ここで復号化やバリデーションなどの任意の処理を挟むことも可能です。

3. 型安全な実装のためのジェネリクス

JsonDeserializerインターフェースはJsonDeserializer<Password>のようにジェネリクス型を指定すると、deserialize()メソッドの戻り値がPassword型として扱われ、より型安全なコードになります。

このようにGsonのカスタムデシリアライザーを活用すれば、日付形式の変換、暗号化データの復号、ネストされたJSON構造の柔軟なマッピングなど、標準機能だけでは対応しきれない要件にも対応できます。

  1. 【Java入門】Gsonライブラリを使ってJSON文字列をファイルに書き込む方法

    GsonライブラリとはGsonは、JavaオブジェクトをJSON形式に変換(シリアライズ)するためのGoogle製オープンソースライブラリです。逆に、JSON文字列からJavaオブジェクトへの変換(デシリアライズ)も簡単に行えるため、JavaでJSONを扱う際の定番ライブラリとして広く利用されています。Gsonを使用する際の中心的なクラスはGsonクラスです。インスタンスはnew Gson()のように直接生成できますが、設定をカスタマイズしたい場合はGsonBuilderクラスを使ってGsonインスタンスを作成することも可能です。この記事では、Gsonクラスが提供するtoJson()メソッドを

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

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