개발하던 과정에서, 데이터를 Json 객체로 받아왔는데, parsing을 해서 제가 원하는 컬렉션 타입으로 변환하기 위한 과정에서 평소에 다른 개발자 분들이 쓰는 코드를 사용하다 문득 왜 이렇게 처리하는지에 대한 궁금증이 생겨, 관련 내용을 정리 해보려고 합니다
1. JSON, JsonObject, JsonArray의 정의와 사용법
우선 각 내용에 대한 정의를 알아보겠습니다. 우선 JSON(JavaScript Object Notation)은 경량 데이터 교환 형식으로, 키-값 쌍 또는 배열 형태로 데이터를 표현하는 문법입니다. JSON 형식의 데이터는 중첩된 데이터 구조를 가질 수 있으며, 이러한 구조를 파싱하려면 JsonObject와 JsonArray 타입을 사용합니다. 예를 들어 아래와 같은 Json 형태가 있다고 가정해보겠습니다.
{
"userId":1,
"order_item_list":[
{
"item":1,
"orderList":"apple"
},
{
"item":2,
"orderList":"banana"
}]
}
JsonObject는 JSON 객체를 나타내며, 중괄호({})로 둘러싸인 키-값 쌍의 집합입니다. JsonObject 객체는 Map과 유사한 형태로 동작하며, 키-값 쌍으로 구성된 JSON 데이터를 쉽게 접근할 수 있도록 해줍니다. 위와 같은 JSON 데이터를 JsonObject로 파싱하면, "userId" 키에 대한 값은 "1"이고, "order_item_list"의 배열의 첫 번째 요소에서 "orderList"의 값은 apple이 됩니다.
JsonArray는 JSON 배열을 나타내며, 대괄호([])로 둘러싸인 값의 목록입니다. JsonArray 객체는 List와 유사한 형태로 동작하며, 배열 형태로 구성된 JSON 데이터를 쉽게 접근할 수 있도록 해줍니다. 예를 들어, 위 내용을 JSON 데이터를 JsonArray로 파싱하면, 첫 번째 요소는 {"userId": 1}이고, 두 번째 요소는 "order_item_list":[{"item": 1, "orderList": apple}]이 됩니다.
2. api 호출 후 응답 값을 받아오기
val request = Request.Builder()
.url(url)
.get()
.build()
val response = httpClient.newCall(request).execute()
try {
val respBody = response.body?.string() ?: ""
val jsonRoot = JsonParser().parse(respBody).asJsonObject
val jsonStylingContentsList = jsonRoot.getAsJsonArray("order_item_list")
해당 소스 코드는 HTTP GET 요청을 보내서 반환된 JSON 데이터를 파싱하는 과정을 수행하는 코드입니다.
우선, Request.Builder()를 사용하여 url 변수에 저장된 URL 주소로 GET 요청을 생성합니다. 이후 httpClient.newCall(request).execute()를 사용하여 생성된 GET 요청을 보내고, 서버로부터 반환된 응답을 response 변수에 저장합니다.그리고 response.body?.string() ?: ""를 사용하여 반환된 응답 바디(body)를 문자열로 변환하고, 이를 respBody 변수에 저장합니다. 이후 JsonParser().parse(respBody).asJsonObject를 사용하여 JSON 문자열을 파싱하여 JsonObject 객체로 변환합니다. 변환된 JsonObject에서 getAsJsonArray()를 사용하여 "order_item_list"라는 JSON 배열을 가져옵니다.
최종적으로, jsonStylingContentsList 변수에 JSON 배열 객체가 저장됩니다. 이 배열은 JsonArray 타입으로 선언되어 있으므로, for 루프나 forEach() 함수를 사용하여 배열 요소를 순회하면서 필요한 작업을 수행할 수 있습니다.
'IT' 카테고리의 다른 글
아이폰14 발열 줄이는 꿀팁 3가지! (0) | 2023.04.04 |
---|---|
비대면바우처플랫폼, 추천서비스 TOP3(23년 최신) (0) | 2023.03.30 |
Spring Data JPA - 데이터 뻥튀기 (일대다 관계 조인) (0) | 2023.03.14 |
코틀린에서 reified를 사용하는 이유 (0) | 2023.03.13 |
Jackson ObjectMapper란? (0) | 2023.03.08 |
댓글