val retrofit = Retrofit.Builder()
.baseUrl("https://example.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
Gson을 포함해 Jacson, Moshi 등의 Converter Library는 모두 Java 언어로 개발이 되어있다. 그러니 코틀린에서 사용 가능하지만, 완벽하게 호환되지 않는다.
Kotlinx Serialization - 코틀린에 가장 적합한 Json Converter
여기 글에서 잘 정리해두었다. 자바로 만든 라이브러리다 보니 코틀린 data class의 장점인 default value 문법을 무시한다는 게 문제다.
primitive 타입의 필드는 0, reference 타입의 필드는 null로 처리해버린다.
게다가 gson 컨버터는 코틀린의 null-safety를 준수하지 않는다. not null field인데 null이 들어가 버린다. 그래서 코틀린에서 Gson, Jacson, Moshi 등 자바 컨버터 라이브러리를 쓸 때는 nullable 선언을 해줘야 한다.
코틀린에서 공식적으로 제공하고 있는 이 라이브러리를 사용하면 default value 문법이 정상적으로 적용된다.
사용법 역시 Kotlinx Serialization - 코틀린에 가장 적합한 Json Converter 여기에 잘 나와있다.
Kotlinx.Serialization + Retrofit 사용하기
여기에 잘 나와있다.
(1) kotlinx.serialization dependency
kotlinx.serialization#setup
위의 공식 문서를 참고.
project 레벨의 build.gradle에 플러그인을 추가하고 module 레벨의 build.gradle에서 플러그인을 적용해줘야 한다.
(2) kotlinx.serialization을 retrofit2와 쉽게 사용할 수 있게 한 com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter dependency
retrofit2-kotlinx-serialization-converter git
val contentType = "application/json".toMediaType()
val retrofit = Retrofit.Builder()
.baseUrl("https://example.com/")
.addConverterFactory(Json.asConverterFactory(contentType))
.build()
패키지명 : kotlinx.serialization.Serializable
내부 클래스에도 모두 @Serialable을 달아준다.
필수로 채워지는 프로퍼티가 아닌 경우 default value를 설정해 이 오류를 방지한다.
https://kotlinlang.org/docs/serialization.html#c35b308c
https://blog.jetbrains.com/kotlin/2020/10/kotlinx-serialization-1-0-released/