2016-08-17 8 views
3

ジャクソンのアノテーション@JsonIgnoreProperties(ignoreUnknown = true)と@JsonInclude(Include.NON_EMPTY)のクラスに違いがあるのは不思議ですレベル? 1つはちょうどもう1つの新しいバージョンですか?ありがとう!Jackson Annotations:JsonIgnoreProperties(ignoreUnknown = true)とJsonInclude(Include.NON_EMPTY)の相違点

jackson docs状態それ:ちょうど、デシリアライゼーション中 未認識の特性を無視しても大丈夫かどうかを定義

ignoreUnknownプロパティ。

これは空のプロパティと同じですか?

答えて

10

短い答え:

  1. @JsonIgnoreProperties(ignoreUnknown=true)は、Javaオブジェクト(POJO)のみにJSONの直列化復元に適用されます。 POJOにJSONに含まれる特定のプロパティが含まれていない場合、それらは無視され、エラーはスローされません。一方@JsonInclude(Include.NON_EMPTY)
  2. はJSONへのPOJOのシリアライズに使用され、それがあるPOJOのプロパティスキップし、こう述べています。

    nullまたは空と見なされているものが含まれていないですが。 の定義空白は、データ型固有です。

長い答え:

@JsonInclude

は、シリアライズ時にのみ使用されます。問題のプロパティ(またはすべてのプロパティ)の値がある値(nullempty - それが意味するものであれ、デフォルト値であれ)と等しい場合、このプロパティはシリアル化されません。

この注釈がない場合、プロパティ値は常にシリアル化されます。アノテーションは、転送されるプロパティの数を減らすのに役立ちます(プロパティのデフォルト値は、受信側に存在しない場合に指定する必要があります)。

例:次の出力を生成します

public class Person { 
    public String firstName = "Mark"; 
    public String middleName; 
    public String lastName = "Watney"; 
} 

ObjectMapper mapper = new ObjectMapper(); 
Person p = new Person(); 
System.out.println(mapper.writeValueAsString(p)); 

{"firstName":"Mark","middleName":null,"lastName":"Watney"} 

しかしPerson@JsonInclude(Include.NON_EMPTY)で注釈されている場合、その値はこの中null( "空" であるので、middleNameは出力から省略されていますケース):

@JsonInclude(Include.NON_EMPTY) 
public static class Person { 
    [....] 
} 

コンソール出力である:{"firstName":"Mark","lastName":"Watney"}

@JsonIgnorePropertiesが

かかわらず、その値のシリアライゼーションおよびデシリアライゼーションに特定のプロパティを無視するように使用される:

シリアライズまたはデシリアライズされてから指定されたフィールドを防ぐために(すなわち、 JSON出力には含まれません。または)それらが含まれていた場合でも、設定されている:@JsonIgnoreProperties({ "internalId", "secretKey" })

例外なくJSON入力中の任意の未知の特性を無視するには:@JsonIgnoreProperties(ignoreUnknown=true)

JSON入力の場合:

{ 
    "firstName": "Homer", 
    "middleName": "Jay", 
    "lastName": "Simpson" 
} 

とクラスです。

public class Person { 
    public String firstName; 
    public String lastName; 
} 

逆シリアル化mapper.readValue(json, Person.class)は、UnrecognizedPropertyException例外: "メイン" com.fasterxml.jackson.databind.exc.UnrecognizedPropertyExceptionスレッドで

例外: 認識できないフィールド "middleName" .....

プロパティmiddleNameではないのでPersonクラスの一部です。

しかし、クラスPerson@JsonIgnoreProperties(ignoreUnknown=true)と注釈が付けられた場合、POJOへの逆シリアル化では不明なプロパティ(middleNameなど)は無視されます。今

@JsonIgnoreProperties("password") 
public static class User { 
    public String login = "simpsonh"; 
    public String password = "D00nut"; 
    public String firstName = "Homer"; 
    public String middleName = "Jay"; 
    public String lastName = "Simpson"; 
} 

を使用すると、Userクラスをシリアル化すると、パスワードを出力から省略されます:

User u = new User(); 
System.out.println(mapper.writeValueAsString(u)); 

@JsonIgnoreProperties(ignoreUnknown=true) 
public class person { 
    [...] 
} 

別の一般的な使用例は、例えば、パスワードのように、敏感なプロパティの直列化を抑制することです

コンソール出力: {"login":"simpsonh","firstName":"Homer","middleName":"Jay","lastName":"Simpson"}

+0

恐ろしいああ、徹底してくれてありがとう! – discodude

+0

あなたは大歓迎です:)! –

関連する問題