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

JavaでGsonを使ってシリアライズ時にフィールドを除外する方法

Gsonにおけるtransient修飾子によるフィールド除外

Gsonライブラリでは、transient修飾子を使うことで、シリアライズ対象から特定のフィールドを簡単に除外できます。Javaクラスのフィールドにtransientを付けると、Gsonはシリアライズ(直列化)デシリアライズ(逆直列化)の両方で、そのフィールドを自動的に無視します。

この仕組みは、パスワードや給与情報などの機密データ、あるいはJSON出力に含める必要のない一時的な値を扱う場合に特に便利です。

コード例

import com.google.gson.*;

public class GsonTransientFieldTest {
    public static void main(String[] args) {
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        Person p = new Person("Raja", "Ramesh", 28, 35000.00);
        String jsonStr = gson.toJson(p);
        System.out.println(jsonStr);
    }
}

// Personクラス
class Person {
    private String firstName;
    private transient String lastName;
    private int age;
    private transient double salary;

    public Person(String firstName, String lastName, int age, double salary) {
        super();
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
        this.salary = salary;
    }
}

上記の例では、PersonクラスのlastNamesalaryフィールドにtransientが宣言されています。

実行結果

{
  "firstName": "Raja",
  "age": 28
}

出力結果を見ると、transientが付いたlastNamesalaryはJSONに含まれておらず、firstNameageのみが出力されていることが確認できます。

補足:@Exposeアノテーションによる制御

transient以外にも、Gsonでは@Exposeアノテーションを使ったより柔軟な制御が可能です。GsonBuilderに対してexcludeFieldsWithoutExposeAnnotation()を設定すると、@Exposeが付いたフィールドだけがシリアライズ・デシリアライズの対象になります。フィールド単位で細かく出力内容を管理したい場合は、こちらの方法も検討するとよいでしょう。

  1. 【Java入門】GsonでカスタムJSONシリアライザーを実装する方法

    カスタムシリアライズとはGsonライブラリでは、JavaオブジェクトをJSONに変換する際に、デフォルトの変換ルールではなく独自の変換ロジックを適用したいケースがあります。たとえば、パスワードのマスキング、日付フォーマットの統一、特定フィールドの出力制御などが代表的な例です。このような場合には、GsonBuilderに対してカスタムシリアライザーを登録することで対応できます。カスタムシリアライザーは、com.google.gson.JsonSerializerインターフェースのserialize()メソッドをオーバーライドして作成します。実装例以下は、Studentクラス(学生情報)をJSON

  2. Javaでオブジェクトをシリアライズ・デシリアライズする方法をわかりやすく解説

    Javaにおけるシリアライズ(直列化)とは、オブジェクトの状態をバイトストリームへと変換するプロセスのことです。オブジェクトがシリアライズ可能になるためには、そのクラスまたは親クラスがSerializableインターフェース、もしくはExternalizableインターフェースを実装している必要があります。一方、デシリアライズとは、シリアライズされたデータを再びオブジェクトのコピーとして復元するプロセスを指します。 transientキーワードの役割 シリアライズの際に、特定の変数の状態をバイトストリームに書き込みたくない場合は、transientキーワードを使用します。JVMはtransie