programing

Jackson의 역직렬화는 @Json Unwraped와 동등합니까?

lastmoon 2023. 2. 26. 10:27
반응형

Jackson의 역직렬화는 @Json Unwraped와 동등합니까?

예를 들어 다음과 같은 수업이 있습니다.

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)모든 속성이 여기에 매핑되므로 [Parent]클래스로 이동합니다.따라서 알 수 없는 JSON 필드에 예외를 발생시키려면 사용자가 직접 수행해야 합니다.또한 맵 값이 Strings 이외의 값일 경우 수동 유형 확인 및 변환을 수행해야 합니다.잭슨이 이 사건을 자동으로 처리할 수 있는 방법이 있나요?

편집: 제가 미쳤을 수도 있지만, 매뉴얼에 명시적으로 기재되어 있지 않은 경우에도 실제로 효과가 있는 것 같습니다.http://fasterxml.github.io/jackson-annotations/javadoc/2.2.0/com/fasterxml/jackson/annotation/JsonUnwrapped.html
전에는 안 먹힐 줄 알았어요.그러나 래핑되지 않은 다형성 유형을 역직렬화하기 위해 커스텀 로직이 필요한 경우에는 제안된 @JsonCreator 접근법이 선호될 수 있습니다.

사용할 수 있습니다.@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);
}

이 경우 잭슨은 당신을 위해 타이프 체크와 미지의 필드 체크를 합니다.

설명하신 것처럼 문서에는 명시적으로 언급되어 있지 않지만, 탈직렬화에도 효과가 있습니다.디시리얼라이제이션에 대해서는 유닛테스트를 참조해 주세요.@JsonUnwrapped확인은 이쪽 - https://github.com/FasterXML/jackson-databind/blob/d2c083a6220f2875c97c29f4823d9818972511dc/src/test/java/com/fasterxml/jackson/databind/struct/TestUnwrapped.java#L138

@JsonUnwrapped는 시리얼라이제이션과 디시리얼라이제이션에 모두 대응하므로 추가 절차를 밟을 필요가 없습니다.

Jackson 2.13 이전 Javadocs에서는 언급되지 않았지만 (jackson-annotations#184에 따라)@JsonUnwrapped주석은 직렬화뿐만 아니라 직렬화에도 적용되므로 주석을 사용하는 필드의 직렬화를 지원하기 위해 추가 작업이 필요하지 않습니다.

Jackson 2.13 Javadocs는 주석이 직렬화 및 직렬화에 적용됨을 명확히 합니다.

속성을 "래핑 해제"해야 함을 나타내는 데 사용되는 주석입니다. 즉, JSON 개체로 일련화할 경우 해당 속성은 포함된 개체의 속성으로 대신 포함되며 재생 "누락됨" 구조의 일련화를 취소합니다.

[...]

값이 역직렬화되면 직렬화된 출력을 다시 읽을 수 있도록 "랩핑"이 적용됩니다.

할 때 .Map , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , .@JsonAnySetter:

public class CountryList
{

    Map<String, Country> countries = new HashMap<>();

    @JsonAnySetter
    public void setCountry(String key, Country value)
    {
        countries.put(key, value);
    }

}

언급URL : https://stackoverflow.com/questions/16570073/whats-the-jackson-deserialization-equivalent-of-jsonunwrapped

반응형