次のクラスがあるとします。
_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アプローチが推奨される場合があります。
各フィールドで@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は型チェックと不明フィールドチェックを行います。
あなたが言ったように、それはドキュメントで明示的に言及されていませんが、逆シリアル化でも機能します。確認のため、ここで@JsonUnwrapped
の逆シリアル化の単体テストを参照してください- https://github.com/FasterXML/jackson-databind/blob/d2c083a6220f2875c97c29f4823d9818972511dc/src/test/Java/com/fasterxml/jackson/ databind/struct/TestUnwrapped.Java#L138
@JsonUnwrapped
はシリアライゼーションとデシリアライゼーションの両方で機能します。追加の手順を実行する必要はありません。
私のようにここでグーグルを回してunwrapepd Map
をデシリアライズするときに問題を解決しようとしている人のために、@JsonAnySetter
による解決策があります:
public class CountryList
{
Map<String, Country> countries = new HashMap<>();
@JsonAnySetter
public void setCountry(String key, Country value)
{
countries.put(key, value);
}
}