【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
}
出力結果を見ると、firstName・lastName・empIdの3つのプロパティのみが出力され、@JsonIgnoreを付けたtechnologiesは除外されていることが確認できます。これは、シリアライズの対象から外れたためです。
補足:複数フィールドやクラス単位で無視したい場合
複数のフィールドをまとめて除外したい、あるいはクラス単位で設定を管理したい場合は、@JsonIgnorePropertiesを使用する方法もあります。
@JsonIgnoreProperties({ "technologies", "internalCode" })
class Employee {
// フィールド定義...
}
さらに、@JsonIgnoreProperties(ignoreUnknown = true)のように指定すると、入力JSONに存在する未知のプロパティを無視できるため、デシリアライズ時のエラー防止にも役立ちます。用途に応じて両者を使い分けるとよいでしょう。
-
JavaのSwingUtilities.invokeLater()メソッドの使い方を徹底解説
invokeLater()メソッドとはinvokeLater()メソッドは、SwingUtilitiesクラスが提供するstaticメソッドの一つで、AWTイベントディスパッチスレッド(Event Dispatch Thread)上でタスクを非同期に実行するために使用されます。このメソッドはSwingUtilities.invokeAndWait()とよく似た動作をしますが、大きな違いは、処理のリクエストをイベントキューに登録した後、すぐに呼び出し元へ制御を返すという点です。つまり、invokeLater()は引数で渡されたRunnableオブジェクト内のコードブロックの実行完了を待ちません。
-
JavaでJComboBoxの項目をソートする方法!DefaultComboBoxModelのカスタマイズ例
JComboBoxはJComponentクラスのサブクラスであり、テキストフィールドと、ユーザーが値を選択できるドロップダウンリストを組み合わせたSwingコンポーネントです。ユーザーがコンボボックスを操作すると、ActionListener、ChangeListener、ItemListenerといったインターフェースを通じてイベントを受け取ることができます。 ただし、標準のJComboBoxにはアイテムを並べ替える(ソートする)機能は用意されていません。そこで本記事では、DefaultComboBoxModelクラスを継承した独自のモデルクラスを作成し、コンボボックスの項目を常に整序された