복붙노트

[SPRING] Jackson - JSON을 클래스 비 직렬화

SPRING

Jackson - JSON을 클래스 비 직렬화

JSON을 반환하는 끝점을 호출하는 중입니다 (Postman에서).

{
    "Result": {
        "attribute1": { ... },
        "attribute2": { ... }
    }
}

이 요청에 의해 반환 된 Content-Type 헤더는 text / x-json입니다 (일반적인 application / json과 반대 됨). 잭슨을 통해 이것을 역 직렬화하려고 할 때 이것이 어떤 문제를 일으키고 있다고 생각합니다. 이 JSON의 POJO는 다음과 같다.

@Getter
@Setter
public class Response {

    @JsonProperty("Result")
    private Result result;

}

Result 클래스는 외부 라이브러리 (이 엔드 포인트를 작성한 동일한 사용자)의 클래스입니다. 어느 쪽이든 RestTemplate.exchange ()를 통해이 끝점을 호출하려고 시도 할 때 Jackson은이 JSON을 유효한 Result 클래스로 deserialize 할 수 없습니다. 나는 이것을하고있다 :

ResponseEntity<Response> response = restTemplate.exchange(url, HttpMethod.GET, null, Response.class);

response.getBody ()를 수행하면 null Result 객체가 포함 된 Response 객체가 반환됩니다. 분명히 Jackson은 JSON을 deserialize하지 않습니다. 나는 이것이 API에 의해 반환 된 비정상적인 text / x-json Content-Type 때문이라고 생각합니다.

나는 또한 MappingJackson2HttpMessageConverter 객체를 text / x-json Content-type을 파싱 할 수 있도록 구성했지만 운은 없다.

MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
jsonConverter.setSupportedMediaTypes(ImmutableList.of(new MediaType("text", "x-json")));
restTemplate.getMessageConverters().add(jsonConverter);

어떤 포인터?

업데이트 : 왜 이것이 작동하지 않는지 모르겠지만 다른 방법을 알아 냈습니다. JSON을 도메인 객체 대신 Map으로 가져 오는 것이 목적이었습니다.

해결법

  1. ==============================

    1.기본적으로 MappingJackson2HttpMessageConverter는 다음에 바인딩됩니다.

    기본적으로 MappingJackson2HttpMessageConverter는 다음에 바인딩됩니다.

    text / x-json을 추가해야합니다.

    MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
    List<MediaType> jsonTypes = new ArrayList<>(jsonConverter.getSupportedMediaTypes());
    jsonTypes.add(new MediaType("text", "x-json"));
    jsonConverter.setSupportedMediaTypes(jsonTypes);
    

    이제 RestTemplate에서 사용해야합니다.

    restTemplate.setMessageConverters(Collections.singletonList(jsonConverter));
    ResponseEntity<RequestPayload> response = restTemplate.exchange(url, HttpMethod.GET, null, RequestPayload.class);
    
  2. from https://stackoverflow.com/questions/55285941/jackson-deserializing-json-to-class by cc-by-sa and MIT license