2012-07-28 15 views
35

私は解決するのは簡単なはずだと思うジャクソンに質問していますが、それは私を殺しています。ジャクソンJSONルート要素による逆シリアル化

のは、私はこのようになりますJavaのPOJOクラス(私のためGetterおよびSetterを想定)としましょう:

class User { 
    private String name; 
    private Integer age; 
} 

をそして、私はユーザーオブジェクトに次のようになりますJSONをデシリアライズしたい:

{ 
    "user": 
    { 
     "name":"Sam Smith", 
     "age":1 
    } 
} 

ユーザーがJSONの第1レベルのオブジェクトではないため、ジャクソンは私に問題を与えています。私は明らかに、単一のUserオブジェクトを持つUserWrapperクラスを作成し、それを使用して逆シリアル化することができますが、より洗練されたソリューションが必要であることがわかります。

どうすればよいですか?

答えて

53

編集:このソリューションは唯一のジャクソンの作品< 2.0

あなたのケースのために簡単な解決策があります:

  • あなたは@JsonRootName(value = "user")とあなたのモデルクラスに注釈を付ける必要があるが、
  • om.configure(Feature.UNWRAP_ROOT_VALUE, true);(1.9の場合)とom.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);(バージョン2の場合)でマッパーを構成する必要があります。

これだけです!


@JsonRootName(value = "user") 
public static class User { 
    private String name; 
    private Integer age; 

    public String getName() { 
     return name; 
    } 

    public void setName(final String name) { 
     this.name = name; 
    } 

    public Integer getAge() { 
     return age; 
    } 

    public void setAge(final Integer age) { 
     this.age = age; 
    } 

    @Override 
    public String toString() { 
     return "User [name=" + name + ", age=" + age + "]"; 
    } 

} 

ObjectMapper om = new ObjectMapper(); 
om.configure(Feature.UNWRAP_ROOT_VALUE, true); 
System.out.println(om.readValue("{ \"user\": {  \"name\":\"Sam Smith\",  \"age\":1 }}", User.class)); 

これが印刷されます:

User [name=Sam Smith, age=1] 
+0

ありがとうございました!私は注釈がなければならないことを知っていましたが、私はGoogle-Fuでそれを表示できませんでした。 –

+1

あなたは大歓迎です! ;) –

+3

今後このページに来る人は、Jackson <2.0(FasterXMLに移行される前はCodehausのとき)としか動作しないことに注意したいと思います。 FasterXMLパッケージでUNWRAP_ROOT_VALUEが見つかりません。 –

関連する問題