RestTemplate으로 받은 Nested JSON 응답을 Map 형태로 처리하는 방법
Nested(계층형) JSON은 다음 같은 형식을 말한다 (response
필드)
{
"resultcode": "00",
"message": "success",
"response": {
"email": "openapi@naver.com",
"nickname": "OpenAPI",
...
}
}
Map<String, Object> map = restTemplate.exchange(
properties.getUserInfoRequestUrl(), // 1
HttpMethod.GET, // 2
requestHttpEntity, // 3
new ParameterizedTypeReference<Map<String, Object>>() {}) // 4
.getBody();
- 요청을 보낼 URI (ex:
https://api.github.com/user
)- 사용할 Http 메서드
- 같이 전달할 Header를 담은
HttpEntity
- JSON을 어떤 타입으로 받을지 지정
그 다음에 Value가 단일 값이라면 (String)map.get(key)
형태로 꺼내면 된다
(String)map.get("resultcode")
계층으로 구성된 부분은 Object를 우선 꺼낸 다음에, objectMapper
를 이용해서 Map<String,String>으로 다시 변환해서 사용하면 된다.
Object response = map.get("response");
Map<String, String> userInfo = new HashMap<>(objectMapper.convertValue(response, new TypeReference<>() {}));
만약 Map으로 받을 필요가 없다면, DTO 클래스에 바로 받을 수도 있다.
ParameterizedTypeReference<타입>
의 타입으로 Map 대신 MainDto
를 넣어준다@Getter
class MainDto {
String resultcode;
String message;
NestedDto response;
static class NestedDto {
String email;
String nickname;
...
}
}
이때 Nested 필드의 필드명이 JSON의 필드명과 일치해야한다.(response
)