[방방곡곡] JsonData 를 DTO 로 파싱하기

body → items → item 내부에 배열로 존재하는 데이터 꺼내기
HootJem's avatar
Dec 04, 2024
[방방곡곡] JsonData 를 DTO 로 파싱하기
 
API 를 채택한 죄로 JsonData를 리턴받고 있다.
notion image
필요한 데이터는
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을 꺼냈다.
       
      notion image
      배열의 0번째 주소를 갖고있는 모습. 이대로는 파싱하기 상당히 번거로워진다.
      System.out.println(itemsNode.get(0).toString());
      를 추가하여 보면 원하는 데이터가 튀어나온다.
notion image
 

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

[HootJem] 개발 기록 블로그