[SpringBoot] SpringBoot ObjectMapper json parsing

곽우현·2022년 7월 22일
0

SpringBoot

목록 보기
1/4
post-thumbnail

Spring boot에서 RestTemplate를 사용하여 OpenAPI를 사용하던 중 1. return되는 값이 너무 많았고, OpenAPI의 2. retrun값의 Content-Type이application/json이 아닌 text/plain; charset=utf-8였다.

1. 필요한 값들만 사용하는 방식

전에 사용했던 방식은 Json형태라 항상 return값과 완전히 같은 Class를 만들고 retTemplate.getForObject()로 받아 사용하였다.

이렇게 만들게 되면 필요없는 값들까지 다 Class의 멤버변수로 명시해주어야 하는데 너무 값이 많으면 유지보수도 힘들고 굳이 그럴 필요는 없겠다 생각하여 필요한 값들만 명시해보니 오류가 발생했다.

return값에서 매핑될 값이 없다는 오류 같았다.

해결 방법

  • @JsonIgnoreProperties(ignoreUnknown = true) 이 어노테이션을 받아올 객체 Class에 명시하면 해결된다.
@JsonIgnoreProperties(ignoreUnknown = true)
@Data
public class ABookInfo {

    private String title;

    private String link;

    ...
}

2. ObjectMapper configure

text/plain 타입으로 리턴이 되면 retTemplate.getForObject() 방식을 사용하여 파싱이 안되는 문제가 발생했다.
일단 String 타입으로 값을 받은 후, ObjectMapper를 사용하여 이를 위에 생성한 객체로 변경하였다.

// 아래 두줄은 이상이 없다.
ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
log.info("response : {}", response);

// ObjectMapper에서 에러 발생
ReturnResponse returnResponse = objectMapper.readValue(response.getBody(), ReturnResponse.class);
log.info("object mapper : {}", returnResponse);

에러 발생..

com.fasterxml.jackson.databind.JsonMappingException: Unrecognized character escape ''' (code 39)

내가 생각했을땐 response값의 빽슬래쉬 등등이 Json 타입과 맞지 않아 ObjectMapper가 정상적으로 객체로 파싱하지 못하는? 것 같다.
구글링 끝에 방법을 찾았다.

해결 방법

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(JsonReadFeature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER.mappedFeature(), true);

ObjectMapper를 생성할때 옵션을 주면 해결된다. return값이 어떠한 문자가 섞여 오는가에 따라 여러가지 옵션을 주면 된다.
ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER,ALLOW_UNESCAPED_CONTROL_CHARS등을 추가하였다.

profile
주니어 Java 개발자

0개의 댓글