[방방곡곡] JsonData 를 DTO 로 파싱하기
body → items → item 내부에 배열로 존재하는 데이터 꺼내기
Dec 04, 2024
API 를 채택한 죄로 JsonData를 리턴받고 있다.

필요한 데이터는
body → items → item 내부에 배열로 존재한다. (개별 데이터만 리턴될텐데 어째서?)1. response 에서 꺼내기
- api 요청 코드
api 요청 주소를 매개변수로 받는다.
 public void fetch(URI url) {
        try {
            RestTemplate restTemplate = new RestTemplate();
            String jsonString = restTemplate.getForObject(url, String.class);
            // Jackson ObjectMapper를 사용하여 JSON 파싱
            ObjectMapper objectMapper = new ObjectMapper();
            JsonNode root = objectMapper.readTree(jsonString);
            // 필요한 item만 추출
            JsonNode itemsNode = root.path("response").path("body").path("items").path("item");
           
        } catch (Exception e) {
          throw new ExceptionApi404(e.getMessage());
        }
    }JsonNode 를 사용하여 item을 꺼냈다.

배열의 0번째 주소를 갖고있는 모습. 이대로는 파싱하기 상당히 번거로워진다.
System.out.println(itemsNode.get(0).toString());를 추가하여 보면 원하는 데이터가 튀어나온다.

2. JsonData → DTO
JsonData 를 DTO로 바꾸기만 하면 된다.
화면구현에 필요한 데이터만 선택적으로 받아오려고 선언했다.
@Data
public static class CommonDTO{
    private String title;
    private String homePage;
    private String firstImage;
    private String firstImage2;
    private String addr1;
    @JsonAlias("mapx")
    private String mapX;
    @JsonAlias("mapy")
    private String mapY;
    private String overview;
}- fetch 아래에 추가함.
String jsonData = itemsNode.get(0).toString();
TourismResponse.CommonDTO dto = objectMapper.readValue(jsonData, TourismResponse.CommonDTO.class);DTO로 파싱하자 아래와 같은 에러가 뜬다.
2024-09-23T17:28:51.656+09:00  WARN 32092 --- [nio-8080-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [green.mtcoding.travel.global.error.ex.ExceptionApi404: Unrecognized field "contentid" (class green.mtcoding.travel.tourismInfo.TourismResponse$CommonDTO), not marked as ignorable (8 known properties: "addr1", "firstImage2", "title", "overview", "firstImage", "mapX", "mapY", "homePage"])<EOL> at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 15] (through reference chain: green.mtcoding.travel.tourismInfo.TourismResponse$CommonDTO["contentid"])]Unrecognized field "contentid"JsonData에는 있는 필드가 DTO 에는 없어서 나는 에러이다.
그러나 원하지 않는 필드까지 파싱하고 싶지않으므로.
@JsonIgnoreProperties(ignoreUnknown = true)DTO에 어노테이션을 추가하였다.
Unknown 필드는 무시하라는 설정이다.
Share article