引言:为什么Kotlin需要处理JSON?
\n\nJSON(JavaScript对象表示法)是一种轻量级数据交换格式,已成为现代Web应用和API的标准。无论您是用Kotlin编写Android应用还是服务器端程序,迟早都需要解析来自服务器的JSON响应,或将您的对象序列化以便发送。
\n\nKotlin是一种现代语言,运行在JVM之上,并与Java完全兼容。然而,Kotlin拥有自己强大的JSON处理工具,使代码更加简洁和安全。在本文中,我们将介绍两种最流行的方法:使用官方库kotlinx.serialization和久经考验的Gson。
\n\n本文面向初学者。我们将从简单的字符串解析开始,然后转向创建复杂的嵌套结构,最后介绍序列化——将您的对象转换回JSON。
\n\n1. 项目准备:依赖项和导入
\n\n在编写代码之前,需要添加库。我们将介绍两种方案。
\n\n1.1. 安装kotlinx.serialization
\n\n这是JetBrains的官方解决方案。在build.gradle.kts文件中添加:
plugins {\n kotlin("jvm") version "1.9.0"\n kotlin("plugin.serialization") version "1.9.0"\n}\n\ndependencies {\n implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0")\n}\n\n\n1.2. 安装Gson
\n\nGson是Google的库。它配置更简单,但需要更多手动操作:
\n\ndependencies {\n implementation("com.google.code.gson:gson:2.10.1")\n}\n\n\n同步项目后即可编写代码。
\n\n2. 使用kotlinx.serialization在Kotlin中解析JSON
\n\n这种方法是最“Kotlin风格”的。您声明data类并添加@Serializable注解。库会自动生成解析代码。
2.1. 简单示例:用户数据
\n\n假设我们有一个JSON字符串:
\n\n{\n "name": "安娜",\n "age": 25,\n "email": "anna@example.com"\n}\n\n\n创建模型:
\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.json.Json\n\n@Serializable\ndata class User(\n val name: String,\n val age: Int,\n val email: String\n)\n\nfun main() {\n val jsonString = """\n {\n "name": "安娜",\n "age": 25,\n "email": "anna@example.com"\n }\n """.trimIndent()\n\n val user = Json.decodeFromString<User>(jsonString)\n println("姓名: ${user.name}, 年龄: ${user.age}")\n}\n\n\n如您所见,无需手动映射——一切都是自动完成的。
\n\n2.2. 处理列表和嵌套对象
\n\n真实的API经常返回数组。添加address字段:
@Serializable\ndata class Address(\n val city: String,\n val street: String\n)\n\n@Serializable\ndata class UserWithAddress(\n val name: String,\n val age: Int,\n val address: Address\n)\n\nfun main() {\n val jsonArray = """\n [\n {"name": "伊万", "age": 30, "address": {"city": "莫斯科", "street": "特维尔大街"}},\n {"name": "玛丽亚", "age": 22, "address": {"city": "圣彼得堡", "street": "涅瓦大街"}}\n ]\n """.trimIndent()\n\n val users = Json.decodeFromString<List<UserWithAddress>>(jsonArray)\n users.forEach { println("${it.name} 住在 ${it.address.city}") }\n}\n\n\n注意:处理列表时使用泛型List<UserWithAddress>。
3. 使用Gson解析JSON
\n\nGson是经典的Java库。它在Kotlin中同样运行良好,但需要稍多一些代码。
\n\n3.1. 基本解析
\n\nimport com.google.gson.Gson\n\ndata cl