[방방곡곡] 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