Nested(계층형) JSON을 Map으로 받는 방법(JAVA)

강병철·2022년 11월 29일
0

RestTemplate으로 받은 Nested JSON 응답을 Map 형태로 처리하는 방법

Nested(계층형) JSON은 다음 같은 형식을 말한다 (response 필드)

{
  "resultcode": "00",
  "message": "success",
  "response": {
  		"email": "openapi@naver.com",
    	"nickname": "OpenAPI",
		...
  }
}

  • 우선 다음 방법으로 JSON을 Map<String,Object>로 받는다.
    (value를 Object로 받아야 Nested JSON을 꺼낼 수 있다)
Map<String, Object> map = restTemplate.exchange(
properties.getUserInfoRequestUrl(), // 1
HttpMethod.GET, // 2
requestHttpEntity, // 3
new ParameterizedTypeReference<Map<String, Object>>() {}) // 4
.getBody(); 
  1. 요청을 보낼 URI (ex: https://api.github.com/user)
  2. 사용할 Http 메서드
  3. 같이 전달할 Header를 담은 HttpEntity
  4. JSON을 어떤 타입으로 받을지 지정
  • 그 다음에 Value가 단일 값이라면 (String)map.get(key) 형태로 꺼내면 된다

    • 상단의 JSON을 예시로 들자면 (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)

0개의 댓글