Kotlin中的JSON处理:库概览与实践示例
JSON(JavaScript Object Notation)仍然是客户端与服务器之间最流行的数据交换格式之一。在广泛用于Android应用开发和服务器端解决方案的Kotlin语言中,有多个强大的库可用于处理JSON。本文将详细讲解主要工具:kotlinx.serialization、Gson、Moshi和Klaxon。您将学习如何解析JSON、序列化对象以及高效处理数据。
1. kotlinx.serialization —— JetBrains的原生方案
kotlinx.serialization是Kotlin官方团队开发的库。其主要优势在于与语言类型系统的完全集成以及对多平台(KMM)的支持。使用时需要在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.Json
@Serializabledata class User(val id: Int, val name: String, val email: String)
fun main() { val jsonString = """{"id":1,"name":"安娜","email":"anna@example.com"}""" // 反序列化 val user = Json.decodeFromString<User>(jsonString) println("用户:${user.name}, 邮箱:${user.email}") // 序列化 val output = Json.encodeToString(user) println(output)}特点:
- 无需反射(在编译阶段工作)。
- 支持自定义序列化器和多态。
- 非常适合Kotlin Multiplatform Mobile。
2. Gson —— Google的经典库
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 json = """{"id":101,"title":"笔记本电脑","price":79990.0}""" // 解析 val product = gson.fromJson(json, Product::class.java) println("商品:${product.title}, 价格:${product.price}") // 反向转换 val newJson = gson.toJson(product) println(newJson)}优点与缺点:
- + 基本场景代码量最少。
- + 支持
@SerializedName注解进行字段映射。 - - 使用反射可能降低性能。
- - 处理
null和泛型类型时存在问题。
3. Moshi —— Square的现代替代方案
Moshi被设计为更安全、更快的Gson替代品。它也使用反射,但通过@JsonClass注解提供代码生成功能。添加依赖:
dependencies { implementation("com.squareup.moshi:moshi-kotlin:1.15.0") ksp("com.squareup.moshi:moshi-kotlin-codegen:1.15.0")}使用代码生成的示例:
import com.squareup.moshi.JsonClassimport com.squareup.moshi.Moshi
@JsonClass(generateAdapter = true)data class Book(val isbn: String, val author: String, val year: Int)
fun main() { val moshi = Moshi.Builder().build() val adapter = moshi.adapter(Book::class.java) val json = """{"isbn":"978-5-17-123456-7","autho