57

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

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

JSON の生成:

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

これをデシリアライズして Parent クラスに戻すにはどうすればよいですか? @JsonCreator を使用できます

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

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

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

4

5 に答える 5

37

各フィールドで@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 が型チェックと不明なフィールドのチェックを行います。

于 2013-05-15T16:27:05.350 に答える