18

Jackson では、NULL オブジェクトがシリアライズされるのを防ぐために、POJO で JsonSerialize アノテーションを使用できます (@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL))。ただし、プリミティブを null に設定することはできないため、この注釈は int のような変更されておらず、デフォルトで 0 に設定されているものに対しては機能しません。

「このクラスでは、デフォルト値と異なる場合を除き、プリミティブをシリアル化しないでください」または「このフィールドでは、値が X の場合はシリアル化しないでください」などと言うことができる注釈はありますか?

4

2 に答える 2

28

Jackson の最近のバージョンを使用している場合はJsonInclude.Include.NON_DEFAULT、プリミティブで機能するはずのものを使用できます。

このアプローチの欠点は、Bean プロパティをデフォルト値に設定しても効果がなく、プロパティがまだ含まれないことです。

@JsonInclude(Include.NON_DEFAULT)
public class Bean {
  private int val;
  public int getVal() { return val; }
  public void setVal(int val) { this.val = val; }
}

Bean b = new Bean();
b.setVal(0);
new ObjectMapper().writeValueAsString(b); // "{}" 
于 2013-01-21T21:54:48.200 に答える
7

実際のところ、Java では、クラス ローダーは初期化されていないすべてのプリミティブ プロパティ (int = 0、boolean = false など) をデフォルト値に設定するため、アプリによって明示的に設定されたものと区別することはできません。私の意見では、次の 2 つのオプションがあります。

  • プリミティブ (Integer、Boolean、Long など) の代わりに、対応するラッパー オブジェクトを使用します。
  • すでに提案されているように、カスタムシリアライザーを定義します
于 2013-01-21T09:57:58.337 に答える