在 Kotlin 中使用 YAML:库、示例与解析

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

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

开始课程

在 Kotlin 中使用 YAML:库、解析与序列化



YAML(YAML Ain't Markup Language)是一种流行的数据序列化格式,广泛用于配置文件、依赖描述和数据交换。由于其可读性和简洁性,YAML 通常比 JSON 或 XML 更受青睐。在 Kotlin 生态系统中,有多个成熟的库可用于处理 YAML。在本文中,我们将介绍三种主要方法:SnakeYAML、Kaml 和 Jackson YAML。



1. SnakeYAML — 经典之选



SnakeYAML 是最流行的用于解析 YAML 的 Java 库,在 Kotlin 中也能很好地工作。它提供了一个底层 API,允许将 YAML 读取为 Map、List 或任意对象。



依赖配置 (Gradle)

dependencies {    implementation("org.yaml:snakeyaml:2.2")}


示例:读取简单 YAML

import org.yaml.snakeyaml.Yaml

fun main() { val yamlString = """ server: host: "localhost" port: 8080 ssl: false database: url: "jdbc:postgresql://localhost/mydb" user: "admin" password: "secret" """.trimIndent()

val yaml = Yaml() val data: Map<String, Any> = yaml.load(yamlString) println(data) // 输出:{server={host=localhost, port=8080, ssl=false}, database={url=jdbc:postgresql://localhost/mydb, user=admin, password=secret}}}


示例:映射到 data class

import org.yaml.snakeyaml.Yamlimport org.yaml.snakeyaml.constructor.Constructor

data class ServerConfig( val host: String, val port: Int, val ssl: Boolean)

data class DatabaseConfig( val url: String, val user: String, val password: String)

data class AppConfig( val server: ServerConfig, val database: DatabaseConfig)

fun main() { val yamlString = """ server: host: "localhost" port: 8080 ssl: false database: url: "jdbc:postgresql://localhost/mydb" user: "admin" password: "secret" """.trimIndent()

val yaml = Yaml(Constructor(AppConfig::class.java)) val config: AppConfig = yaml.load(yamlString) println(config.server.host) // localhost println(config.database.port) // 错误!DatabaseConfig 中没有 port}


重要提示: SnakeYAML 使用 Java 反射,因此 data class 必须具有无参构造函数,或者使用指定了类的 Constructor。对于嵌套结构,可能需要手动配置。



2. Kaml — 原生 Kotlin 库



Kaml(Kotlin YAML 库)是一个使用 kotlinx.serialization 编写的现代 Kotlin 库。它提供了类型安全性,支持密封类、可空字段和自定义序列化器。



依赖配置 (Gradle)

dependencies {    implementation("net.mamoe.yamlkt:yamlkt:0.13.0")    // 或者    implementation("com.charleskorn.kaml:kaml:0.56.0")}


我们将重点介绍 charleskorn 的 Kaml,因为它更受欢迎且正在积极开发中。



示例:序列化和反序列化

import kotlinx.serialization.Serializableimport kotlinx.serialization.encodeToStringimport kotlinx.serialization.decodeFromStringimport com.charleskorn.kaml.Yaml

@Serializabledata class ServerConfig( val host: String = "localhost", val port: Int = 8080, val ssl: Boolean = false)

@Serializabledata class AppConfig( val server: ServerConfig, val name: String)

fun main() { val config = AppConfig( server = ServerConfig(host = "example.com", port = 443, ssl = true), name = "MyApp" )

// 序列化为 YAML val yamlO

推荐