在 Kotlin 中使用 YAML:库与示例

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

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

开始课程

在 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 类工作

推荐