IT

Jackson JSON 루트 요소에 의한 역직렬화

itgroup 2023. 3. 9. 21:59
반응형

Jackson JSON 루트 요소에 의한 역직렬화

나는 잭슨에게 간단하게 풀어야 한다고 생각하는 질문을 하고 있지만, 그것은 나를 죽인다.

예를 들어 다음과 같은 Java POJO 클래스가 있다고 가정합니다(Getters 및 Setters for me).

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

그리고 다음과 같은 JSON을 User 객체로 역직렬화하려고 합니다.

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

Jackson은 사용자가 JSON의 첫 번째 수준 개체가 아니기 때문에 나에게 문제를 주고 있습니다.1개의 User 객체를 가진 UserWrapper 클래스를 만들고 그것을 사용하여 역직렬화할 수 있지만, 보다 우아한 솔루션이 있을 것입니다.

어떻게 해야 되지?

편집: 이 솔루션은 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]

언급URL : https://stackoverflow.com/questions/11704255/jackson-json-deserialization-with-root-element

반응형