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クラスのlastNameとsalaryフィールドにtransientが宣言されています。
実行結果
{
"firstName": "Raja",
"age": 28
}
出力結果を見ると、transientが付いたlastNameとsalaryはJSONに含まれておらず、firstNameとageのみが出力されていることが確認できます。
補足:@Exposeアノテーションによる制御
transient以外にも、Gsonでは@Exposeアノテーションを使ったより柔軟な制御が可能です。GsonBuilderに対してexcludeFieldsWithoutExposeAnnotation()を設定すると、@Exposeが付いたフィールドだけがシリアライズ・デシリアライズの対象になります。フィールド単位で細かく出力内容を管理したい場合は、こちらの方法も検討するとよいでしょう。
-
【Java入門】GsonでカスタムJSONシリアライザーを実装する方法
カスタムシリアライズとはGsonライブラリでは、JavaオブジェクトをJSONに変換する際に、デフォルトの変換ルールではなく独自の変換ロジックを適用したいケースがあります。たとえば、パスワードのマスキング、日付フォーマットの統一、特定フィールドの出力制御などが代表的な例です。このような場合には、GsonBuilderに対してカスタムシリアライザーを登録することで対応できます。カスタムシリアライザーは、com.google.gson.JsonSerializerインターフェースのserialize()メソッドをオーバーライドして作成します。実装例以下は、Studentクラス(学生情報)をJSON
-
Javaでオブジェクトをシリアライズ・デシリアライズする方法をわかりやすく解説
Javaにおけるシリアライズ(直列化)とは、オブジェクトの状態をバイトストリームへと変換するプロセスのことです。オブジェクトがシリアライズ可能になるためには、そのクラスまたは親クラスがSerializableインターフェース、もしくはExternalizableインターフェースを実装している必要があります。一方、デシリアライズとは、シリアライズされたデータを再びオブジェクトのコピーとして復元するプロセスを指します。 transientキーワードの役割 シリアライズの際に、特定の変数の状態をバイトストリームに書き込みたくない場合は、transientキーワードを使用します。JVMはtransie