[kotlin] Serialization을 이용하여 JSON를 다루어 보자

Kolin에서 Json를 보통 Gson 라이브러리를 사용하여 다룬다. Gson를 사용해도 원만한 처리는 가능하다. Serialization은 Gson에서 지원이 미흡한 NEP문제에 대해 강력하게 제한함으로써 kotlin의 가치관를 그대로 반영한 라이브러리이다. 이글은 kotlin의 serialization에 대하여 설정부터 간단한 사용법을 정리할 예정이다.

◆ Maven 설정

<properties>
    <kotlin.version>1.6.10</kotlin.version>
    <serialization.version>1.3.2</serialization.version>
</properties>

버전 정보를 속성에 명시한다.

<build>
    <plugins>
        <plugin>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-maven-plugin</artifactId>
            <version>${kotlin.version}</version>
            <executions>
                <execution>
                    <id>compile</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <compilerPlugins>
                    <plugin>kotlinx-serialization</plugin>
                </compilerPlugins>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.jetbrains.kotlin</groupId>
                    <artifactId>kotlin-maven-serialization</artifactId>
                    <version>${kotlin.version}</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

Plugin 정보를 추가한다.

<dependency>
    <groupId>org.jetbrains.kotlinx</groupId>
    <artifactId>kotlinx-serialization-json</artifactId>
    <version>${serialization.version}</version>
</dependency>

마지막으로 dependency를 추가한다. gradle보다 설정이 좀 복잡하다. dependency 뿐만아니라 plugin를 추가해야만 사용 가능 하다. gradle 설정 참고

◆ JSON object class 작성

@Serializable
data class Foo(
    @SerializedName("id")
    val id: Int? = null,
    @SerializedName("name")
    val name: String? =null,
    @SerializedName("age")
    val age: Int? = null,
)

@Serializable 어노테이션을 사용하면 해당 class는 Serialization라이브러리를 사용할 수 있는 객체로 된다. @SerializedName은 json에 매핑되는 key 값을 의미한다. Serialization을 사용하면 null 값에 대한 설정 부분이 약간 민감하다. Gson를 사용하면 class에서 null값 허용을 설정해 주지 않아도 알아서 무시한다. Serialization에서는 초기값을 null로 설정해 주지않으면 null 값을 Parsing하지 않고 exception을 발생 시킨다.

◆사용

//DeSerialize
val fooStr = """{"id":1,"name":"foo","age":20}""""
val fooObj = Json.decodeFromString<Foo>(fooStr)
//Serialize
val jsonList = Json.encodeToString(fooObj )

◆프로젝트에서의 사용

타 사이트와 연동하거나 타 서비스와 데이터를 주고 받음에 있어 요즘은 json포맷이 보편화 되였다.

프로젝트에서 쉽게 json class을 생성하는 방법을 공유하려고 한다. IntelliJ에서 Json To kotlin class라는 plugin를 설치하고 class 파일을 만든 후 클릭 메뉴에서 generate ...를 선택하고 kotlin data from json를 선택하고 json 을 붙여 넣으면 자동으로 kotlin class를 생성해 준다. Advanced를 클릭하여 어노테이션, null 값에 대한 처리 대한 옵션을 선택할 수 있다. 자동으로 생성해준 class는 완벽할 수 없으므로 한번 검토해 보고 사용하는 것이 좋다.

 

TiP:

Gson vs serialization

1. not null 변수에 null이 들어 갈 수 있음, kotlin 언어의 null safe 장점이 사라진다

2. default value 적용 불가

 

Ref:

https://kotlinlang.org/docs/serialization.html#example-json-serialization

https://github.com/Kotlin/kotlinx.serialization

'Kotlin' 카테고리의 다른 글

[Kotlin] foreach 와 map 알고 쓰자  (0) 2022.01.12
[kotlin] Collection & Sequence  (0) 2021.11.23
[kotlin] 자주 사용하는 문법 정리  (0) 2021.11.23
[Kotlin] apply, with, let, also, run 사용  (0) 2021.11.09