JSONのライブラリ何を使ってますか?
👉 square/moshi: A modern JSON library for Kotlin and Java.
👉 FasterXML/jackson: Main Portal page for the Jackson project
👉 google/gson: A Java serialization/deserialization library to convert Java Objects into JSON and back
これらは、Javaベースで書かれています。Kotlin は100%相互運用可能ですが微妙に期待しない挙動をします。
data class User(
val name: String,
val email: String,
val age: Int = 13,
val role: Role = Role.Viewer
)
enum class Role { Viewer, Editor, Owner }
{
"name" : "John Doe",
"email" : "john.doe@email.com"
}
class JsonUnitTest {
private val jsonString = """
{
"name" : "John Doe",
"email" : "john.doe@email.com"
}
""".trimIndent()
@Test
fun gsonTest() {
val user = Gson().fromJson(jsonString, User::class.java)
assertEquals("John Doe",user.name)
assertEquals(null, user.role)
assertEquals(0, user.age)
// User(name=John Doe,
// email=john.doe@email.com,
// age=0,
// role=null)
}
}
デフォルト値が期待通りにパースできません。
kotlinx.serialization が登場!!
JetBrains産です。間違いないでしょう。
👉 Kotlin/kotlinx.serialization: Kotlin multiplatform / multi-format serialization
- クロスプラットフォーム
- 非リフレクション
- アノテーション @Serializable
- Kotlin v1.3.30+
@Serializable
data class User(
val name: String,
val email: String,
val age: Int = 13,
val role: Role = Role.Viewer
)
enum class Role { Viewer, Editor, Owner }
class JsonUnitTest {
private val jsonString = """
{
"name" : "John Doe",
"email" : "john.doe@email.com"
}
""".trimIndent()
@Test
fun jsonTest() {
val user = Json.parse(User.serializer(), jsonString)
assertEquals("John Doe", user.name)
assertEquals(Role.Viewer, user.role)
assertEquals(13, user.age)
// User(name=John Doe,
// email=john.doe@email.com,
// age=13,
// role=Viewer)
}
}
Gson では無視されていたデフォルト値がきちんと使用されます。
以下のセットアップでどうぞ。
buildscript {
ext.kotlin_version = '1.3.60'
repositories { jcenter() }
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
}
}
apply plugin: 'kotlin'
apply plugin: 'kotlinx-serialization'
repositories {
jcenter()
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.14.0" // JVM dependency
}
👉 Kotlinx Json vs Gson - Juraj Kušnier - Medium
【Retrofit】データクラス エンティティ フィールド名の付け替え @SerializedName @Json @SerialName https://t.co/eok3FYqnse #kotlin #プログラミング
— chanzmao (@maochanz) May 1, 2023