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

JavaでJSONオブジェクトの複数のプロパティを無視する方法:@JsonIgnorePropertiesアノテーションの使い方

JavaでJacksonライブラリを使用してJSONのシリアライズ・デシリアライズを行う際、特定のプロパティやフィールドを処理対象から除外したいケースはよくあります。そんなときに役立つのが@JsonIgnorePropertiesアノテーションです。

@JsonIgnorePropertiesアノテーションを使うと、クラスに対して無視したいプロパティ(フィールド)のリストを指定できます。個々のフィールドごとにアノテーションを付ける代わりに、クラス宣言の直上に配置することで、複数のプロパティをまとめて無視できるのが特徴です。

@JsonIgnorePropertiesの構文

@Target(value={ANNOTATION_TYPE,TYPE,METHOD,CONSTRUCTOR,FIELD})
@Retention(value=RUNTIME)
public @interface JsonIgnoreProperties

使用例:複数のプロパティを無視する

以下の例では、Customerクラスの「id」と「address」という2つのプロパティを@JsonIgnorePropertiesで指定し、シリアライズ・デシリアライズの両方で除外しています。

import java.io.*;
import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.databind.*;

public class JsonIgnorePropertiesTest {
   public static void main(String[] args) throws IOException {
      Customer customer = new Customer("120", "Ravi", "Hyderabad");
      System.out.println(customer);

      ObjectMapper mapper = new ObjectMapper();
      String jsonString = mapper.writeValueAsString(customer);
      System.out.println("JSON: " + jsonString);
      System.out.println("---------");

      jsonString = "{\"id\":\"130\",\"name\":\"Rahul\", \"address\":\"Mumbai\"}";
      System.out.println("JSON: " + jsonString);
      customer = mapper.readValue(jsonString, Customer.class);
      System.out.println(customer);
   }
}

// Customerクラス
@JsonIgnoreProperties({"id", "address"})
class Customer {
   private String id;
   private String name;
   private String address;

   public Customer() {
   }

   public Customer(String id, String name, String address) {
      this.id = id;
      this.name = name;
      this.address = address;
   }

   public String getId() {
      return id;
   }

   public String getName() {
      return name;
   }

   public String getAddress() {
      return address;
   }

   @Override
   public String toString() {
      return "Customer [id=" + id + ", name=" + name + ", address=" + address + "]";
   }
}

実行結果

Customer [id=120, name=Ravi, address=Hyderabad]
JSON: {"name":"Ravi"}
---------
JSON: {"id":"130","name":"Rahul", "address":"Mumbai"}
Customer [id=null, name=Rahul, address=null]

動作のポイント

この実行結果から、@JsonIgnorePropertiesの挙動がよく分かります。

  • シリアライズ時(Java → JSON): 無視対象に指定した「id」と「address」は出力されず、JSONには「name」のみが含まれます。
  • デシリアライズ時(JSON → Java): 入力JSONに「id」や「address」が含まれていても、これらは読み飛ばされるため、対応するフィールドはnullのままになります。

補足:ignoreUnknownオプションについて

@JsonIgnorePropertiesには、存在しないプロパティへの対処に便利なignoreUnknown属性もあります。次のように指定すると、JSON側にJavaクラスに定義されていない未知のプロパティが含まれていても、UnrecognizedPropertyExceptionが発生せずエラーなく処理を続行できます。

@JsonIgnoreProperties(ignoreUnknown = true)
class Customer {
   // ...
}

外部APIからのレスポンスなど、フィールドが変動しうるJSONを扱う場合には、ignoreUnknown = trueを設定しておくと安全です。このように@JsonIgnorePropertiesを活用すれば、シリアライズ・デシリアライズ時に不要なプロパティを柔軟に制御できます。

  1. Javaでプロパティファイルからデータを読み取る方法を解説

    JavaのPropertiesクラスは、Hashtableクラスのサブクラスであり、永続化可能なプロパティの集合(プロパティセット)を表します。Propertiesオブジェクトはストリームへ保存したり、ストリームから読み込んだりすることができます。また、プロパティリスト内の各キーとそれに対応する値は、どちらも文字列型として扱われます。Javaでは、Propertiesファイルを使うことでアプリケーションの設定情報を外部化し、キーと値(key-value)のペアとして管理できます。Propertiesクラスが提供するload()メソッドを使用すると、.propertiesファイルに記述されたキー

  2. JavaオブジェクトをJSONに変換する方法(Jackson・Gsonの使い方)

    このチュートリアルでは、JavaオブジェクトをJSON形式に変換する方法を、定番ライブラリであるJacksonとGsonの2つを使って解説します。 サンプルとして使用するのは、ごく標準的なPOJO(Plain Old Java Object)であるPersonクラスです。Personオブジェクトを作成したら、それぞれのライブラリを使ってJSONへ変換してみましょう。 Person.java import java.util.List; import java.util.Map; public class Person { String name; Integer age;