短い答え:
@JsonIgnoreProperties(ignoreUnknown=true)
は、Javaオブジェクト(POJO
)のみにJSONの直列化復元に適用されます。 POJOにJSONに含まれる特定のプロパティが含まれていない場合、それらは無視され、エラーはスローされません。一方@JsonInclude(Include.NON_EMPTY)
に
はJSONへのPOJOのシリアライズに使用され、それがあるPOJOのプロパティスキップし、こう述べています。
nullまたは空と見なされているものが含まれていないですが。 の定義空白は、データ型固有です。
長い答え:
@JsonInclude
は、シリアライズ時にのみ使用されます。問題のプロパティ(またはすべてのプロパティ)の値がある値(null
、empty
- それが意味するものであれ、デフォルト値であれ)と等しい場合、このプロパティはシリアル化されません。
この注釈がない場合、プロパティ値は常にシリアル化されます。アノテーションは、転送されるプロパティの数を減らすのに役立ちます(プロパティのデフォルト値は、受信側に存在しない場合に指定する必要があります)。
例:次の出力を生成します
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"}
恐ろしいああ、徹底してくれてありがとう! – discodude
あなたは大歓迎です:)! –