2013-05-15 19 views
32

は、私は以下のクラスがあるとしましょう:@JsonUnwrappedに相当するJacksonの逆シリアル化は何ですか?

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")); 
} 

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

編集: 私は夢中になるかもしれませんが、これは実際には、明示的に文書に述べられていないされないにも関わらず動作するように表示されます。http://fasterxml.github.io/jackson-annotations/javadoc/2.2.0/com/fasterxml/jackson/annotation/JsonUnwrapped.html
私はそれが以前に私のために動作しませんでしたかなり確信していました。それでも、未処理の多態型を逆シリアル化するためにカスタムロジックが必要な場合には、提案されている@JsonCreatorアプローチが望ましいかもしれません。

+2

'@JsonUnwrapped'がデシリアライズのために動いていますか?私はそれを試したところ、フラット化されたJSONを逆シリアル化しようとすると「JSONを読み取れませんでした:認識できないフィールド...」というエラーが発生しました。 –

答えて

26

あなたは、各フィールドの@JsonProperty@JsonCreatorを使用することができます。

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

ジャクソンはチェックして、未知のフィールドは、このケースでは、あなたのために型チェックありません。

+1

良い点。これは、残っている唯一の有用な疑問であるかもしれない一般的なJsonCreatorsでのjackson型/フィールドチェックの保存方法の問題に答えるものです。 =) – Shaun