2013-01-21 1 views
10

ジャクソンでは、nullオブジェクトのシリアル化を防止するために、JsonSerializeアノテーションをPOJOで使用することができます(@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL))。しかし、プリミティブはヌルに設定することはできません。この注釈は、タッチされていないintのようなものでは機能しません。jacksonがデフォルト値でプリミティブをシリアル化しないようにするには

「アノテーション」は、このクラスでは、プリミティブがデフォルト値と異なる場合を除き、プリミティブをシリアル化しないでください。 "または"このフィールドでは、値がXの場合はシリアル化しないでください "。

+0

は、カスタム・シリアライザを使用して考えがありますか?どのようにプリミティブで動作するか分かりませんが、少なくともそれを見てください。 – atomman

+0

それは私が聞いていないことを望んでいた答えでした=)。バニラの設定とJsonProperty、JsonIgnore、JsonFilterの注釈で、これまでのところすべてがうまくいっています。 私はそれをチェックしますが、ありがとう。 – galactoise

答えて

20

を定義します。私の意見では、2つのオプションがありジャクソンの最近のバージョンを使用して、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); // "{}" 
+0

これはまさに私が探していたものです!私のバージョンはどれくらい最近になっている必要がありますか? – galactoise

+0

'JsonSerialize.Inclusion'または' JsonInclude.Include'(Jackson 2.xを使用している場合)の 'NON_DEFAULT'オプションの列挙をチェックすると、それは思ったよりもずっと長くなっているように見えます – HiJon89

3

実際、Javaでは、クラスローダーはデフォルト値に初期化されていないプリミティブプロパティ(int = 0、boolean = falseなど)を設定しないため、明示的にそれらを区別することはできません。あなたのアプリ。 「あなたの場合は

  • 使用
  • がすでに提案(..長整数、ブール、)の代わりにプリミティブのラッパーオブジェクトを、対応する、カスタム・シリアライザ