web-dev-qa-db-ja.com

@JsonUnwrappedに相当するジャクソンの逆シリアル化とは何ですか?

次のクラスがあるとします。

_public class Parent {
  public int age;
  @JsonUnwrapped
  public Name name;
}
_

JSONの生成:

_{
  "age" : 18,
  "first" : "Joey",
  "last" : "Sixpack"
}
_

これを親クラスに逆シリアル化するにはどうすればよいですか? @JsonCreatorを使用できます

_@JsonCreator
public Parent(Map<String,String> jsonMap) {
  age = jsonMap.get("age");
  name = new Name(jsonMap.get("first"), jsonMap.get("last"));
}
_

ただし、これにより、すべてのプロパティがここにマッピングされるため、Parentクラスに@JsonIgnoreProperties(ignoreUnknown=true)が効果的に追加されます。したがって、不明なJSONフィールドで例外をスローする必要がある場合は、自分で行う必要があります。さらに、マップの値が文字列以外の場合は、手動で型チェックと変換を行う必要があります。ジャクソンがこのケースを自動的に処理する方法はありますか?

編集:私はクレイジーかもしれませんが、ドキュメントで明示的に言及されていないにもかかわらず、これは実際に機能するように見えます: http:// fasterxml。 github.io/jackson-annotations/javadoc/2.2.0/com/fasterxml/jackson/annotation/JsonUnwrapped.html
以前はうまくいかないと確信していました。それでも、ラップされていないポリモーフィック型を逆シリアル化するためにカスタムロジックが必要な場合は、提案された@JsonCreatorアプローチが推奨される場合があります。

42
Shaun

各フィールドで@JsonCreator@JsonPropertyを使用できます。

@JsonCreator
public Parent(@JsonProperty("age") Integer age, @JsonProperty("firstName") String firstName,
        @JsonProperty("lastName") String lastName) {
    this.age = age;
    this.name = new Name(firstName, lastName);
}

この場合、Jacksonは型チェックと不明フィールドチェックを行います。

32
hoaz

あなたが言ったように、それはドキュメントで明示的に言及されていませんが、逆シリアル化でも機能します。確認のため、ここで@JsonUnwrappedの逆シリアル化の単体テストを参照してください- https://github.com/FasterXML/jackson-databind/blob/d2c083a6220f2875c97c29f4823d9818972511dc/src/test/Java/com/fasterxml/jackson/ databind/struct/TestUnwrapped.Java#L138

8
spinlok

@JsonUnwrappedはシリアライゼーションとデシリアライゼーションの両方で機能します。追加の手順を実行する必要はありません。

0
Artem Areshko

私のようにここでグーグルを回してunwrapepd Mapをデシリアライズするときに問題を解決しようとしている人のために、@JsonAnySetterによる解決策があります:

public class CountryList
{

    Map<String, Country> countries = new HashMap<>();

    @JsonAnySetter
    public void setCountry(String key, Country value)
    {
        countries.put(key, value);
    }

}
0
Jan Mares