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

【Jackson】JavaでJSONシリアライズ時に特定のフィールドを無視する方法(@JsonIgnoreの使い方)

JavaオブジェクトをJSONに変換する際、パスワードや内部データなど、外部に出力したくないフィールドが含まれていることがあります。そんなときに活躍するのが、Jacksonライブラリが提供する@JsonIgnoreアノテーションです。

@JsonIgnoreはフィールドに対して付与でき、シリアライズ(Java→JSON)デシリアライズ(JSON→Java)の両方の処理において、対象のフィールドを完全に無視します。

@JsonIgnoreの基本構文

public @interface JsonIgnore

このアノテーションはフィールドのほか、ゲッター・セッターメソッドやコンストラクタの引数にも適用できます。どの場所に付与しても、同じプロパティに対する効果は変わりません。

使用例

次のサンプルでは、Employeeクラスのtechnologiesフィールドに@JsonIgnoreを付与しています。コード上ではリストに値を追加していますが、JSON出力には反映されない点に注目してください。

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

public class JsonIgnoreAnnotationTest {
   public static void main(String args[]) throws JsonGenerationException, JsonMappingException, IOException {
      Employee emp = new Employee();
      emp.setFirstName("Raja");
      emp.setLastName("Ramesh");
      emp.setEmpId(120);
      emp.getTechnologies().add("Java");
      emp.getTechnologies().add("Scala");
      emp.getTechnologies().add("Python");
      ObjectMapper mapper = new ObjectMapper();
      mapper.writerWithDefaultPrettyPrinter().writeValue(System.out, emp);
   }
}

// Employeeクラス
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
   "firstName",
   "lastName",
   "technologies",
   "empId"
})
class Employee {
   @JsonProperty("EMPLOYEE_ID")
   private int empId;

   @JsonProperty("EMPLOYEE_FIRST_NAME")
   private String firstName;

   @JsonProperty("EMPLOYEE_LAST_NAME")
   private String lastName;

   @JsonIgnore
   private List<String> technologies = new ArrayList<>();

   public int getEmpId() {
      return empId;
   }

   public void setEmpId(int empId) {
      this.empId = empId;
   }

   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 List<String> getTechnologies() {
      return technologies;
   }

   public void setTechnologies(List<String> technologies) {
      this.technologies = technologies;
   }
}

実行結果

{
   "EMPLOYEE_FIRST_NAME" : "Raja",
   "EMPLOYEE_LAST_NAME" : "Ramesh",
   "EMPLOYEE_ID" : 120
}

出力結果を見ると、firstNamelastNameempIdの3つのプロパティのみが出力され、@JsonIgnoreを付けたtechnologiesは除外されていることが確認できます。これは、シリアライズの対象から外れたためです。

補足:複数フィールドやクラス単位で無視したい場合

複数のフィールドをまとめて除外したい、あるいはクラス単位で設定を管理したい場合は、@JsonIgnorePropertiesを使用する方法もあります。

@JsonIgnoreProperties({ "technologies", "internalCode" })
class Employee {
   // フィールド定義...
}

さらに、@JsonIgnoreProperties(ignoreUnknown = true)のように指定すると、入力JSONに存在する未知のプロパティを無視できるため、デシリアライズ時のエラー防止にも役立ちます。用途に応じて両者を使い分けるとよいでしょう。

  1. JavaのSwingUtilities.invokeLater()メソッドの使い方を徹底解説

    invokeLater()メソッドとはinvokeLater()メソッドは、SwingUtilitiesクラスが提供するstaticメソッドの一つで、AWTイベントディスパッチスレッド(Event Dispatch Thread)上でタスクを非同期に実行するために使用されます。このメソッドはSwingUtilities.invokeAndWait()とよく似た動作をしますが、大きな違いは、処理のリクエストをイベントキューに登録した後、すぐに呼び出し元へ制御を返すという点です。つまり、invokeLater()は引数で渡されたRunnableオブジェクト内のコードブロックの実行完了を待ちません。

  2. JavaでJComboBoxの項目をソートする方法!DefaultComboBoxModelのカスタマイズ例

    JComboBoxはJComponentクラスのサブクラスであり、テキストフィールドと、ユーザーが値を選択できるドロップダウンリストを組み合わせたSwingコンポーネントです。ユーザーがコンボボックスを操作すると、ActionListener、ChangeListener、ItemListenerといったインターフェースを通じてイベントを受け取ることができます。 ただし、標準のJComboBoxにはアイテムを並べ替える(ソートする)機能は用意されていません。そこで本記事では、DefaultComboBoxModelクラスを継承した独自のモデルクラスを作成し、コンボボックスの項目を常に整序された