해당 포스팅은 네이버의 책 Open API
를 호출하고, 응답 결과를 파싱하여 원하는 값을 추출해 객체로 저장하는 과정을 정리한 글입니다.
eunsilson - BookMarky 에서 실제 코드를 확인할 수 있습니다.
JavaScript Object Notation의 약자로서, Key-Value 형태의 데이터를 표현하는 데 사용되는 형식이다.
응답 받은 값을 그대로 출력했을 때의 모습입니다. 이중 JSON 형태로 String 값이 들어왔습니다.
item
Key 내에 검색어와 관련도가 높은 책 데이터 7개가 들어있습니다.{
"lastBuildDate":"Thu, 04 Jul 2024 19:15:37 +0900",
"total":7,
"start":1,
"display":7,
"items":[
{
"title":"용의자 X의 헌신 (제134회 나오키상 수상작, 갈릴레오 시리즈 3)",
"link":"https:\/\/search.shopping.naver.com\/book\/catalog\/32463541483",
"image":"https:\/\/shopping-phinf.pstatic.net\/main_3246354\/32463541483.20230815075809.jpg",
"author":"히가시노 게이고",
"discount":"15000",
"publisher":"재인",
"pubdate":"20170830",
"isbn":"9788990982704",
"description":"정교한 살인수식에 도전하는 천재 물리학자의 집요한 추적이 시작된다!\n\n히가시노 게이고 문학의 정수로 일컬어지는 추리 소설 『용의자 X의 헌신』. 일본 문학 전문 번역가 양억관이 자신의 번역을 대폭 손질해 원작이 지닌 문학적 향기와 감동을 오롯이 되살려냈다. 일본 추리소설에서 흔히 보여 지는 잔혹함이나 엽기 호러가 아닌 사랑과 헌신이라는 고전적이며 낭만적인 테마를 미로처럼 섬세하게 엮어낸 슬프고 아름다운 이야기로, 제134회 나오키상을 수상했다. \n\n도쿄 에도가와 인근 한 연립 주택에서 중년 남자가 모녀에 의해 살해된다. 숨진 남자는 도가시. 한때 술집 호스티스였으나 지금은 도시락 가게에서 일하면서 첫 남편 사이에 낳은 딸 마사토를 키우고 있는 여자, 하나오카 야스코의 이혼한 두 번째 남편이다. 돈을 갈취하기 위해 찾아와 폭력을 휘두르는 그를 모녀가 우발적으로 목 졸라 살해하고, 우연히 사건을 눈치 채게 된 옆집 사는 고등학교 수학교사 이시가미가 그녀를 돕겠다고 나선다. \n\n마음속으로 야스코를 깊이 사모해 왔던 이시가미는 완전범죄 만들기에 나서게 된다. 대학 시절 백 년에 한번 나올까 말까 한 천재라는 소리를 듣던 그는 빈틈없는 알리바이를 만들고, 경찰 심문에 대응하는 요령까지 모녀에게 세세히 지시하여 경찰의 수사를 혼선에 빠뜨린다. 사건 다음날, 얼굴을 알아볼 수 없는 중년 남자의 변사체가 발견되고, 경찰은 그것이 도가시의 사체임을 밝혀낸다. \n\n야스코가 유력한 용의자로 수사선상에 떠오르고, 경찰은 그녀의 알리바이를 확인하는 데 총력을 기울이지만 별다른 소득을 얻지 못한다. 수사가 답보 상태에 빠진 상황에서 형사 구사나기는 자신이 어려움에 처할 때마다 등장해 사건 해결의 실마리를 던져주던 천재 물리학자, 일명 ‘탐정 갈릴레오’, 유가와에게 S.O.S를 친다. 유가와는 구사나기에게 야스코의 이웃인 이시가미의 이름을 듣고 그가 대학 시절 자신과 전공은 다르지만 서로의 천재성을 인정했던 동창생이라는 사실을 기억해내고, 이시가미가 사건에 개입했음을 직감하는데……."
}
]
}
전체 코드입니다. 파싱하는 과정에서 발생하는 예외 처리를 위해 try-catch로 묶었습니다.
ObjectMapper
: JSON을 Java 객체로 변환하기 위한 인스턴스readTree
: JSON 데이터를 트리 구조로 표현node.path("items")
: item 속성에 해당되는 노드를 추출함이제 item 내의 JSON에만 접근할 수 있습니다.
treeToValue
: JsonNode를 변환할 클래스의 타입의 객체로 자동 변환@JsonProperty
를 작성합니다.@JsonIgnoreProperties(ignoreUnknown = true)
을 작성해 객체 변환 시 알 수 없는 필드를 무시할 수 있도록 합니다.Book으로 변환한 객체를 List에 담아 반환한 결과입니다.
(List에 담는 부분은 포스팅에 작성하지 않았습니다.)
W3C에서 개발된, 다른 특수한 목적을 갖는 마크업 언어를 만드는데 사용하도록 권장하는 다목적 마크업 언어
응답 받은 값을 그대로 출력했을 때의 모습입니다.
XML 형식의 String으로 값이 들어왔습니다.
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>Naver Open API - book_adv ::''</title>
<link>https://search.naver.com</link>
<description>Naver Search Result</description>
<lastBuildDate>Thu, 04 Jul 2024 19:19:41 +0900</lastBuildDate>
<total>1</total>
<start>1</start>
<display>1</display>
<item>
<title>용의자 X의 헌신</title>
<link>https://search.shopping.naver.com/book/catalog/43289318227</link>
<image>https://shopping-phinf.pstatic.net/noimage/noimage.jpg</image>
<author>히가시노 게이고</author>
<discount>0</discount>
<publisher>현대문학</publisher>
<pubdate>20080617</pubdate>
<isbn>480ZZA0000100</isbn>
<description>-</description>
</item>
</channel>
</rss>
getElementByTagName.item(0)
: item 태그 내의 모든 요소 선택0
으로 고정함.getChildNodes().item(i)
: item 요소의 자식 노드를 순차적으로 선택.getTextContent()
: 해당 노드의 텍스트 내용 추출bookInfo에 Book 객체의 값이 차례로 저장되었습니다.
리스트의 값으로 객체를 생성해 반환합니다.