在 Kotlin 中处理 JSON:完整指南
JSON(JavaScript 对象表示法)仍然是 Web 开发、移动应用和微服务中最流行的数据交换格式之一。Kotlin 作为面向 JVM、Android 和多平台项目的现代语言,提供了多种强大的工具来处理 JSON。在本文中,我们将详细解析主要库、它们的特性以及最佳实践。
为什么在 Kotlin 中需要 JSON 库?
虽然 Kotlin 运行在 JVM 上并且可以使用 Java 库,但原生 Kotlin 解决方案(例如 kotlinx.serialization)提供了:
- 编译时的类型安全
- 对数据类和密封类的支持
- 多平台能力(KMP)
- 最少的样板代码
Kotlin 中处理 JSON 的主要库
1. kotlinx.serialization(推荐)
这是 JetBrains 的官方库,内置于 Kotlin 生态系统中。它支持多平台且不需要反射机制。
配置(Gradle):
plugins { kotlin("jvm") version "1.9.22" kotlin("plugin.serialization") version "1.9.22"}
dependencies { implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.2")}JSON 解析示例:
import kotlinx.serialization.*import kotlinx.serialization.json.*
@Serializabledata class User( val id: Int, val name: String, val email: String, @SerialName("is_active") val isActive: Boolean = false)
fun main() { val jsonString = """ { "id": 1, "name": "Иван Петров", "email": "ivan@example.com", "is_active": true } """.trimIndent()
val user = Json.decodeFromString<User>(jsonString) println("用户:${user.name},活跃状态:${user.isActive}")
// 序列化回 JSON val jsonOutput = Json.encodeToString(user) println(jsonOutput)}2. Gson(来自 Google)
流行的 Java 库,易于适配 Kotlin。适用于不需要多平台支持的简单项目。
示例:
import com.google.gson.Gsonimport com.google.gson.annotations.SerializedName
data class Product( @SerializedName("product_id") val id: Int, val title: String, val price: Double)
fun main() { val gson = Gson() val json = """{"product_id": 101, "title": "Ноутбук", "price": 79999.99}""" val product = gson.fromJson(json, Product::class.java) println("商品:${product.title},价格:${product.price} 卢布") // 反向序列化 val jsonOut = gson.toJson(product) println(jsonOut)}3. Moshi(来自 Square)
Gson 的现代替代方案,性能更好且支持 Kotlin 代码生成。
示例:
import com.squareup.moshi.Moshiimport com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactoryimport com.squareup.moshi.adapters.PolymorphicJsonAdapterFactory
data class Book( val isbn: String, val author: String, val year: Int)
fun main() { val moshi = Moshi.Builder() .add(KotlinJsonAdapterFactory()) .build() val adapter = moshi.adapter(Book::class.java) val json = """{"isbn": "978-5-17-123456-7", "author": "Лев Толстой", "year": 1877}""" val book = adapter.fromJson(json) println("书籍:${book?.author} - ISBN:${book?.isbn}")}库的对比
- kotlinx.serialization — 新项目、多平台和 Android 的最佳选择。需要编译器插件。
- Gson — 易于使用,适合快速原型开发