引言:为什么JSON是现代Kotlin开发者的基石
JSON(JavaScript对象表示法)仍然是服务器与客户端之间数据交换的事实标准,无论是Android移动应用还是基于Ktor的后端。在Kotlin生态系统中,由于语言严格的类型系统和强大的序列化库,处理JSON尤其方便。在本文中,我们将探讨两种主要方法:使用官方库kotlinx.serialization和流行的Gson。您将学习如何解析复杂结构、序列化对象以及在实际中处理异常。
项目准备与依赖添加
在编写代码之前,需要将库添加到build.gradle.kts文件(针对Gradle)。我们来看两种方案。
方案1:kotlinx.serialization(推荐)
- 在
plugins中添加插件:kotlin("plugin.serialization") version "1.9.22" - 在
dependencies中指定:implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.2")
方案2:Gson(用于与Java项目兼容)
- 在
dependencies中添加:implementation("com.google.code.gson:gson:2.10.1")
// build.gradle.kts — kotlinx.serialization的完整示例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")}在Kotlin中解析JSON:从简单到复杂
解析(反序列化)是将JSON字符串转换为Kotlin对象的过程。我们以用户数据为例进行说明。
数据示例
{ "id": 123, "name": "安娜", "email": "anna@example.com", "active": true}创建Data Class
两个库使用相同的类。重要提示:对于kotlinx.serialization,需要添加@Serializable注解。
import kotlinx.serialization.Serializable
@Serializabledata class User( val id: Int, val name: String, val email: String, val active: Boolean)使用kotlinx.serialization解析
import kotlinx.serialization.json.Json
fun parseWithKotlinx(jsonString: String): User { val json = Json { ignoreUnknownKeys = true } // 忽略未知字段 return json.decodeFromString<User>(jsonString)}
// 使用方式:fun main() { val json = """{"id":123,"name":"安娜","email":"anna@example.com","active":true}""" val user = parseWithKotlinx(json) println(user.name) // 安娜}使用Gson解析
import com.google.gson.Gson
fun parseWithGson(jsonString: String): User { val gson = Gson() return gson.fromJson(jsonString, User::class.java)}
// 使用方式:fun main() { val json = """{"id":123,"name":"安娜","email":"anna@example.com","active":true}""" val user = parseWithGson(json) println(user.email) // anna@example.com}序列化:将对象转换为JSON
反向过程——从对象创建JSON字符串——对于向服务器发送数据同样重要。
使用kotlinx.serialization序列化
import kotlinx.serialization.encodeToString
fun serializeWithKotlinx(user: User): String { val json = Json { prettyPrint = true } return json.encodeToString(user)}
// 结果:// {// "id": 123,// "name": "安娜",// "email": "anna@example.com",// "active": true// }使用Gson序列化
fun serializeWithGson(user: User): String { val gson = GsonBuilder().setPrettyPrinting().create() return gson.toJson(user)}<