JSON Jackson은 다른 키를 같은 필드로 해석합니다.
다음과 같은 필드가 있는 POJO가 있습니다.
public class Media {
private Asset asset;
}
json 응답을 이 자산 POJO에 구문 분석하면 모든 것이 완벽하게 작동하지만, 이 자산과 함께 제공되는 키에는 약간의 차이가 있습니다.다음의 어느쪽인가를 지정할 수 있습니다.
@JsonProperty("cover_asset")
또는
@JsonProperty("asset")
POJO에 주석을 달아 이 사례를 인식하고 동일한 필드에 다시 일련화할 수 있는 방법이 있습니까?둘 다 같은 응답으로 나타나는 것은 불가능합니다.
디시리얼라이제이션만이 당신의 관심사이기 때문에2.9
이 상황에 딱 맞습니다.다음과 같은 작업을 수행할 수 있습니다.
@JsonAlias({"cover_asset", "asset"})
private Asset asset;
속성에 대한 하나 이상의 대체 이름을 정의하는 데 사용할 수 있는 주석으로, 공식 이름 대신 역직렬화 중에 수락됩니다.에일리어스 정보는 POJO 검사 시에도 공개되지만 프라이머리 이름이 항상 사용되는 시리얼라이제이션 중에는 영향을 주지 않습니다.
주의: 관련된 모든 종속성을 업데이트하십시오.annotations
,core
,databind
를 참조해 주세요.업데이트만annotations
다른 사람이 없으면 런타임 오류가 발생합니다.
좀 더 간결하게는 두 개의 @JsonSetter 주석을 사용하는 것이 좋습니다.여기 작업 예가 있습니다.즉, Java 클래스는 속성에 사용할 getter 메서드를 2개가 아닌 1개만 가집니다.또한 Media 클라이언트에 노출되지 않는 설정기를 비공개로 만들고 json 키 중 하나를 특별한 방식으로 처리할 수도 있습니다.
import com.fasterxml.jackson.annotation.JsonGetter;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonSetter;
import com.fasterxml.jackson.databind.ObjectMapper;
@SuppressWarnings("unused")
public class Media {
private Asset asset;
@JsonGetter("asset")
public Asset getAsset() {
return asset;
}
@JsonSetter("asset")
public void setAsset(Asset asset) {
this.asset = asset;
}
@JsonSetter("cover_asset")
private void setMediaAsset(Asset asset) {
if (this.asset == null) {
setAsset(asset);
}
}
private static class Asset {
@JsonProperty("foo")
private String foo;
}
public static void main(String[] args) throws Exception {
String withAsset = "{'asset': {'foo':'bar'}}";
String withCoverAsset = "{'cover_asset': {'foo':'bar'}}";
ObjectMapper mapper = new ObjectMapper();
Media mediaFromAsset = mapper.readValue(withAsset.replace('\'','"'), Media.class);
Media mediaFromCoverAsset = mapper.readValue(withCoverAsset.replace('\'','"'), Media.class);
System.out.println(mediaFromAsset.asset.foo.equals(mediaFromCoverAsset.asset.foo));
}
}
비카스와 존 알리아스의 훌륭한 답변입니다.
두 개의 월드(Json Property & Alias)에서도 이익을 얻을 수 있다고 덧붙입니다.[잭슨 2.9 이후]
@JsonProperty("cover_asset")
@JsonAlias({"asset", "cover_asset","amazing_asset"})
private Asset asset;
동일한 POJO 필드를 참조하는 두 속성 이름 모두에 대해 getters/setters를 사용할 것을 제안합니다.
public class Media {
private Asset asset;
@JsonProperty("cover_asset")
public Asset getCoverAsset() {
return asset;
}
public void setCoverAsset(Asset asset) {
this.asset= asset;
}
@JsonProperty("asset")
public Asset getAsset() {
return asset;
}
public void setAsset(Asset asset) {
this.asset= asset;
}
}
중복될 수 있는 질문에 대한 답변도 참조하십시오.직렬화 및 역직렬화 중 JSON 속성의 다른 이름
언급URL : https://stackoverflow.com/questions/19564711/json-jackson-parse-different-keys-into-same-field
'programing' 카테고리의 다른 글
리액트 링크 vs 태그 및 화살표 기능 (0) | 2023.03.16 |
---|---|
UI 뷰가 아닌 맨 위로 스크롤하는 각도 UI 라우터 (0) | 2023.03.16 |
Oracle DB에서 실행 중인 프로세스를 표시하려면 어떻게 해야 합니까? (0) | 2023.03.16 |
NoSch Method Error: javax.servlet을 가져오는 중입니다.Spring MVC 응용 프로그램 실행 중 Spring Boot의 ServletContext.addServlet (0) | 2023.03.16 |
json 또는 jsonb 또는 텍스트를 선택할 데이터 유형 (0) | 2023.03.16 |