programing

JSON Jackson은 다른 키를 같은 필드로 해석합니다.

showcode 2023. 3. 16. 22:02
반응형

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;

@JsonAlias 문서:

속성에 대한 하나 이상의 대체 이름을 정의하는 데 사용할 수 있는 주석으로, 공식 이름 대신 역직렬화 중에 수락됩니다.에일리어스 정보는 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

반응형