inblog logo
|
하쎄의 기술 일기장
    TeamProject

    [Travel] JsonData → DTO 파싱하기

    JsonData → DTO 파싱하기
    하세연's avatar
    하세연
    Sep 29, 2024
    [Travel] JsonData → DTO 파싱하기
    Contents
    1. response 에서 꺼내기2. 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

    하쎄의 기술 일기장

    RSS·Powered by Inblog