在 Kotlin 中使用 YAML:库概述与使用示例
YAML(YAML Ain't Markup Language)是一种方便的数据序列化格式,常用于配置文件、API 规范(OpenAPI)描述和数据交换。在 Kotlin 生态系统中,有几个成熟的库可用于处理 YAML,每个库都有其自身的特点。在本文中,我们将探讨三种主要方法:使用 SnakeYAML、kaml 和 kotlinx.serialization 处理 YAML 格式。
1. SnakeYAML — 适用于 JVM 的经典解析器
SnakeYAML 是最流行的 Java YAML 处理库,与 Kotlin 完全兼容。它提供了用于解析和创建 YAML 文档的低级 API。
添加依赖
在 build.gradle.kts 中添加依赖:
implementation("org.yaml:snakeyaml:2.2")示例:读取 YAML
考虑文件 config.yaml:
server: host: localhost port: 8080database: url: jdbc:postgresql://localhost/mydb user: admin password: secret解析代码:
import org.yaml.snakeyaml.Yamlimport java.io.File
fun main() { val yaml = Yaml() val inputStream = File("config.yaml").inputStream() val data: Map<String, Any> = yaml.load(inputStream)
val server = data["server"] as Map<String, Any> println("主机: ${server["host"]}") println("端口: ${server["port"]}")
val db = data["database"] as Map<String, Any> println("数据库 URL: ${db["url"]}")}示例:创建 YAML
fun createYaml() { val data = mapOf( "appName" to "MyApp", "version" to "1.0.0", "features" to listOf("auth", "logging", "metrics") )
val yaml = Yaml() val writer = FileWriter("output.yaml") yaml.dump(data, writer) writer.close()}SnakeYAML 的优点:
- 与 Java 项目最大兼容性
- 支持 YAML 1.1 的所有功能(锚点、标签、自定义类型)
- 通过
DumperOptions灵活配置
缺点:
- 使用原始类型
Map<String, Any>工作 — 需要进行类型转换 - 不原生支持 Kotlin 的 data 类
2. kaml — 支持 data 类的 Kotlin 库
kaml 是 SnakeYAML 的一个封装,增加了对 Kotlin data 类反序列化和序列化的支持。该库使用 Kotlin 反射自动进行映射。
添加依赖
implementation("net.mamoe.yamlkt:yamlkt:0.13.0")示例:反序列化为 data 类
import net.mamoe.yamlkt.Yamlimport net.mamoe.yamlkt.YamlElement
data class ServerConfig( val host: String, val port: Int)
data class AppConfig( val server: ServerConfig, val debug: Boolean = false)
fun main() { val yaml = Yaml() val input = """ server: host: "0.0.0.0" port: 8080 debug: true """.trimIndent()
val config = yaml.decodeFromString(AppConfig.serializer(), input) println("服务器: ${config.server.host}:${config.server.port}") println("调试模式: ${config.debug}")}示例:序列化
fun serializeConfig() { val config = AppConfig( server = ServerConfig("localhost", 9090), debug = false )
val yaml = Yaml() val output = yaml.encodeToString(AppConfig.serializer(), config) println(output)}kaml 的优点:
- 类型安全 — 使用 Kotlin data 类工作