Kotlin 中的 JSON 处理:库、工具与代码示例
JSON(JavaScript Object Notation)是现代 Web 开发中最流行的数据交换格式之一。在使用 Kotlin 开发应用时(无论是 Android、后端还是桌面应用),几乎总是需要解析和生成 JSON。本文将详细介绍 Kotlin 中用于处理 JSON 的主要库、它们的特性、优势,并提供实用的代码示例。
为什么需要在 Kotlin 中单独处理 JSON?
Kotlin 是一种静态类型语言,运行在 JVM(以及 Native 和 JS)之上。与动态语言不同(动态语言可以“即时”将 JSON 转换为字典),Kotlin 通常使用类型化对象进行操作。这提高了代码的可靠性,并允许 IDE 自动提示字段。为了将 JSON 转换为 Kotlin 对象(data 类)以及反向转换,需要使用序列化/反序列化库。
Kotlin 中主要的 JSON 库
我们将介绍三个最流行的库:kotlinx.serialization(JetBrains 推荐)、Gson(来自 Google)和 Moshi(来自 Square)。
1. kotlinx.serialization
这是 JetBrains 支持的官方 Kotlin 序列化库。它基于多平台(JVM、Native、JS)运行,不使用反射,从而提供高性能和类型安全。
安装:在 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.Serializableimport kotlinx.serialization.json.Jsonimport kotlinx.serialization.encodeToStringimport kotlinx.serialization.decodeFromString
@Serializabledata class User(val name: String, val age: Int, val email: String? = null)
fun main() { val json = Json { prettyPrint = true; ignoreUnknownKeys = true }
// 序列化(对象 -> JSON) val user = User("阿列克谢", 30, "alex@example.com") val jsonString = json.encodeToString(user) println(jsonString)
// 反序列化(JSON -> 对象) val input = """{"name":"玛丽亚","age":25}""" val parsedUser = json.decodeFromString<User>(input) println(parsedUser)}特性:
- 支持可空字段(如示例中的
email)。 - 通过 DSL 进行配置:
prettyPrint、ignoreUnknownKeys等。 - 支持枚举、密封类、嵌套对象。
- 多平台支持——同一套代码可用于 Android、iOS、Web。
2. Gson
Gson 是 Google 的经典库,在 Java 世界中广泛使用。它在 Kotlin 中也能工作,但需要谨慎处理可空类型和 data 类。
安装:
dependencies { implementation("com.google.code.gson:gson:2.10.1")}示例:
import com.google.gson.Gsonimport com.google.gson.GsonBuilder
data class Product(val id: Int, val title: String, val price: Double)
fun main() { val gson: Gson = GsonBuilder().setPrettyPrinting().create()
// 序列化 val product = Product(1, "笔记本电脑", 89999.99) val json = gson.toJson(product) println(json)
// 反序列化 val jsonString = """{"id":2,"title":"鼠标","price":1500.50}""" val parsed = gson.fromJson(jsonString, Product::class.java) println(parsed)}重要提示:Gson 使用反射,因此对于 Kotlin data 类,可能需要 @JvmOverloads 或配置 图书馆中也有
推荐