在Kotlin中处理JSON:实战解析与序列化

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么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)}<                

博客

书籍推荐