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
'programing' 카테고리의 다른 글
인터페이스 정의에서 getters/setters를 사용할 수 있습니까? (0) | 2023.02.26 |
---|---|
AngularJs에서 정수를 문자열로 변환하려면 어떻게 해야 합니까? (0) | 2023.02.26 |
리액트 훅을 사용하여 소품을 상태와 동기화하는 방법: setState() (0) | 2023.02.26 |
임베디드 서버의 스프링 부트 구성 커스텀 jsessionid (0) | 2023.02.26 |
WooCommerce API를 사용하여 국가/주 목록 가져오기 (0) | 2023.02.26 |