web-dev-qa-db-ja.com

ルート要素を使用したJackson JSONデシリアライゼーション

私はジャクソンに簡単に解決できると思う質問を持っていますが、それは私を殺しています。

Java POJOクラスは次のようになっているとしましょう(ゲッターとセッターを想定しています):

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

そして、次のようなJSONをデシリアライズしてUserオブジェクトにしたいと思います。

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

ユーザーはJSONの第1レベルのオブジェクトではないため、Jacksonから問題が発生します。明らかに、単一のUserオブジェクトを持つUserWrapperクラスを作成し、それを使用してデシリアライズすることもできますが、もっとエレガントなソリューションが必要だと思います。

どうすればいいですか?

40
Sam Stern

編集:このソリューションはjackson <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]
63