在 Kotlin 中使用 JSON 的入门指南
JSON (JavaScript Object Notation) 是服务器与客户端之间最流行的数据交换格式之一。在现代 Kotlin 开发中,无论是 Android 应用还是服务器端项目,高效处理 JSON 都是一项必备技能。本文将详细讲解如何使用最流行的库 kotlinx.serialization 和 Gson 在 Kotlin 中执行 JSON 的解析和序列化。
无论您是在创建 REST API、处理外部服务的响应,还是保存本地设置,理解 JSON 的工作原理都将帮助您编写更清晰、更高效的代码。
Kotlin 中 JSON 解析基础
什么是序列化和反序列化?
在进入代码之前,理解两个关键概念很重要:
- 序列化 — 将 Kotlin 对象(data class、列表等)转换为 JSON 字符串。
- 反序列化(解析) — 反向过程:从 JSON 字符串创建 Kotlin 对象。
Kotlin 没有内置的 JSON 支持,因此我们使用第三方库。下面介绍两个最流行的库。
kotlinx.serialization 库
kotlinx.serialization 是 JetBrains 的官方库,与 Kotlin 语言完美集成。它在编译阶段工作,提供了高性能和类型安全。
添加库依赖
首先,在 build.gradle.kts 中添加插件:
plugins { kotlin("plugin.serialization") version "1.9.22"}
dependencies { implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.2")}定义数据模型
创建一个表示用户的类:
import kotlinx.serialization.Serializable
@Serializabledata class User( val name: String, val age: Int, val email: String? = null, // nullable 字段 val roles: List<String> = emptyList())@Serializable 注解告诉编译器这个类可以被序列化。
序列化(对象 → JSON)
import kotlinx.serialization.encodeToStringimport kotlinx.serialization.json.Json
fun main() { val user = User( name = "安娜", age = 28, email = "anna@example.com", roles = listOf("admin", "user") )
val jsonString = Json.encodeToString(user) println(jsonString) // {"name":"安娜","age":28,"email":"anna@example.com","roles":["admin","user"]}}反序列化(JSON → 对象)
import kotlinx.serialization.decodeFromString
fun main() { val json = """{"name":"伊万","age":35,"roles":["user"]}""" val user = Json.decodeFromString<User>(json) println(user.name) // 伊万 println(user.email) // null (JSON 中未指定)}配置 Json 设置
您可以自定义解析器的行为:
val json = Json { prettyPrint = true // 美化输出格式 ignoreUnknownKeys = true // 忽略 JSON 中多余的字段 isLenient = true // 允许宽松解析(例如引号)}
val user = json.decodeFromString<User>(jsonString)Gson 库
Google 的 Gson 是另一个流行的库,尤其在 Android 开发中广泛使用。
添加 Gson 依赖
dependencies { implementation("com.google.code.gson:gson:2.10.1")}使用示例
import com.google.gson.Gson
data class Product( val id: Int, val title: String, val price: Double)
fun main() { val gson = Gson() // 序列化 val product = Product(1, "笔记本电脑", 999.99) val json = gson.toJson(product) println(json) // 反序列化 val jsonString = """{"id":2,"title":"鼠标","price":29.99}""" val parsedProduct = gson.fromJson(jsonString, Product::class.java) println(parsedProduct.title) // 鼠标}