Kotlin (코틀린)

[Kotlin] JSON (2) - JSON 다루기 / JSON 파싱 / JSONObject / JSONArray / Gson

Oscar:) 2024. 8. 17. 21:40

 

 

 

지난 포스팅에서는 JSON이 무엇인지 간단히 알아보았다.

 

이번에는 JSONObject, JSONArray, Gson을 활용하여 JSON 데이터를 다뤄본다.

 

 

 


 

JSON 데이터 준비

 

 

JSON 데이터를 다루기 위해서는 먼저 JSON 데이터가 있어야 한다.

 

임의의 OPEN API 에서 데이터를 받아오고 파싱해도 되지만,

간소화하고 직접 문자열을 만들어주자.

 

        val jsonData = """
            {
            "name" = "Oscar",
            "age" = 29,
            "hobby" = "공부"
            }
        """.trimIndent()

 

 

""" 기호를 활용한 형식화된 다중 문자열을 사용하여

Key - Value 형태의 JSON 데이터를 하드코딩해줬다.

 

 

""" 기호를 처음 본다면 다음 포스팅을 참고해도 좋다.

 

[Kotlin] 문자열 이어 붙이기 / 형식화된 다중 문자열 사용하기 / ($, """) 기호

문자열을 이어 붙여서 출력하는 상황에 주로 사용할 수 있는 코틀린의 기호를 알아보자.   문자열 이어 붙이기 $  코틀린에서 문자열을 이어 붙여야 하는 상황에서는 $ 기호를 사용할 수 있다

oscarstory.tistory.com

 

 

 


 

JSONObject

 

 

JSON 데이터를 다루기 위해서는 JSONObject를 사용한다.

 

JSON 데이터는 Key - Value 형식으로 이루어져있다고 설명했었는데,

해당 형식의 자료구조 정도로 생각하면 쉽다.

 

val jsonObject = JSONObject(jsonData)

val name: String = jsonObject["name"].toString()
val age: String = jsonObject["age"].toString()
val hobby: String = jsonObject["hobby"].toString()

Log.d(TAG, "name: $name")
Log.d(TAG, "age: $age")
Log.d(TAG, "hobby: $hobby")

 

jsonData를 파라미터로 JSONObject를 생성해주고, 사용할 변수에 초기화 해주었다.

결과 확인을 위해 로그도 찍어준다.

 

 

Java 에서는 jsonObject.get("Key") 와 같은 형식으로 사용하지만,
Kotlin 이기에 대괄호로 간편히 사용할 수 있다.

 

 

 

결과)

 

 

Key에 알맞는 Value만 잘 파싱된 것을 확인할 수 있다.

 

 

 


 

JSONArray

 

 

JSONArray는 단순한 배열이라고 생각하면 쉽다.

JSON 형태의 배열일 뿐이다.

 

그렇기에 JSONObject와 구분하기 가장 쉬운 방법은 괄호의 종류다.

 

JSONArray = 대괄호 []
JSONObject = 중괄호 {}

 

 

 

다음과 같은 JSON 데이터가 있다고 가정한다.

        val jsonData = """
            [
            {
            "name" = "Oscar",
            "age" = 29,
            "hobby" = "공부"
            },
            {
            "name" = "Stella",
            "age" = 27,
            "hobby" = "음주"
            },
            {
            "name" = "Taron",
            "age" = 20,
            "hobby" = "볼링"
            }
            ]
        """.trimIndent()

 

 

JSONObject 예제에서 파싱해봤던 JSONObject가 3덩이 있고, 대괄호로 감싸져 있다.

 

 

안드로이드 환경에서 이를 파싱해보자.

val jsonArray = JSONArray(jsonData)

for (i in 0 until jsonArray.length()) {
	val jsonObject = jsonArray[i] as JSONObject
    
	val name = jsonObject["name"].toString()
	val age = jsonObject["age"].toString()
	val hobby = jsonObject["hobby"].toString()
    
	Log.d(TAG, "name: $name / age: $age / hobby: $hobby")
}

 

 

JSON 데이터가 시작부터 끝까지 대괄호[]로 감싸져 있기 때문에

JSONArray()의 생성자 파라미터로 jsonData를 받을 수 있다.

 

반복문을 사용하는 부분 안에는

JSONObject를 파싱하는 방법과 동일하기에 크게 어려울 것이 없다.

 

 

결과)

 

 

원하는 데이터가 잘 파싱된 모습이다.

 

 

 


 

Gson 사용해보기

 

 

Gson은 구글에서 개발한 오픈소스 라이브러리다.

 

Gson은 JSON 형식의 데이터를 Java의 객체로 역직렬화,

또는 Java의 객체를 JSON 형식으로 직렬화해주는 역할을 한다.

 

아무래도 Java에 초점을 맞춘 라이브러리다 보니,

클래스에 데이터가 끼워맞춰지는 파싱이 기가 막힌다...

(Retrofit을 사용할 때 GsonConverter를 장착하여 자동 파싱하는 원리와 같다)

 

 

 

사용법 또한 정말 간편하다.

 

 

 

● 먼저 build.gradle (모듈 수준)에 다음 의존성을 추가한다.

implementation("com.google.code.gson:gson:2.8.9")

 

 

● JSONObject에서 사용했던 JSON 데이터를 재탕한다.

        val jsonData = """
            {
            "name" = "Oscar",
            "age" = 29,
            "hobby" = "공부"
            }
        """.trimIndent()

 

 

● 그 다음, 위 데이터 형식에 맞는 데이터 클래스를 준비해준다.

data class Person(
    val name: String,
    val age: String,
    val hobby: String
)

 

 

그리고 Gson을 이용해서 Person 클래스에 데이터를 세팅해준다.

val person = Gson().fromJson(jsonData, Person::class.java)

Log.d(TAG, "Person: $person")

 

 

 

결과)

 

 

 

Person 데이터 클래스에 데이터가 세팅된 모습이다.

 

 

 


 

 

 

위에서 Gson().fromJson() 메서드로 데이터를 세팅해보았다.

이번에는 List 형식의 데이터를 Json 형식으로 변환해보자.

 

 

 

● 먼저, Person 클래스 형식의 List를 생성해주고, 데이터를 2개 추가해줬다.

val personList = ArrayList<Person>()

personList.add(Person("Oscar", "29", "공부"))
personList.add(Person("Stella", "27", "음주"))

 

 

● toJson() 메서드에 위 ArrayList를 넣어주고 로그를 찍어보자.

val jsonArray = Gson().toJson(personList)

Log.d(TAG, "jsonArray: $jsonArray")

 

변수명이 jsonArray 이지만, 사실 위 변수는 String이다.

어찌되었든 JSON 데이터는 결국 하나의 문자열이기 때문이다.

 

 

 

결과)

 

 

JSONArray 형식으로 잘 출력된 것을 확인할 수 있다.

 

 

 

 


 

 

 

JSON 데이터를 다루는 방법에 대해 간단히 알아보았다.

 

JSON 데이터의 형식이 아직 익숙치 않다면 조금 복잡해보일 수 있다.

 

JSONObject와 JSONArray를 중괄호{}와 대괄호[]로 구분만 잘 해주고,

데이터의 뎁스만 잘 파악하여 파싱해주면 어렵지 않다.