JSONのライブラリ何を使ってますか?
👉 square/moshi: A modern JSON library for Kotlin and Java. ![](http://b.hatena.ne.jp/entry/image/https://github.com/square/moshi)
👉 FasterXML/jackson: Main Portal page for the Jackson project ![](http://b.hatena.ne.jp/entry/image/https://github.com/FasterXML/jackson)
👉 google/gson: A Java serialization/deserialization library to convert Java Objects into JSON and back ![](http://b.hatena.ne.jp/entry/image/https://github.com/google/gson)
これらは、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" : "[email protected]"
}
class JsonUnitTest {
private val jsonString = """
{
"name" : "John Doe",
"email" : "[email protected]"
}
""".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 protected],
// age=0,
// role=null)
}
}
デフォルト値が期待通りにパースできません。
kotlinx.serialization が登場!!
JetBrains産です。間違いないでしょう。
![](https://i0.wp.com/android.benigumo.com/wp-content/uploads/2020/01/45ea3a92f2a0e43bc0d2bf94a15b4326.png?ssl=1)
👉 Kotlin/kotlinx.serialization: Kotlin multiplatform / multi-format serialization ![](http://b.hatena.ne.jp/entry/image/https://github.com/Kotlin/kotlinx.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" : "[email protected]"
}
""".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 protected],
// 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 ![](http://b.hatena.ne.jp/entry/image/https://medium.com/@jurajkunier/kotlinx-json-vs-gson-4ba24a21bd73)