ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

kaml快速开始:data class与YAML双向转换,4个实战例子讲清核心用法

2026/8/22 13:29:27 拓冰建站 浏览量
kaml快速开始:data class与YAML双向转换,4个实战例子讲清核心用法 kaml快速开始data class与YAML双向转换4个实战例子讲清核心用法【免费下载链接】kamlYAML support for kotlinx.serialization项目地址: https://gitcode.com/gh_mirrors/ka/kamlkaml 是一个为 Kotlin 生态提供 YAML 支持的开源库它为 kotlinx.serialization 补上了 YAML 序列化这块拼图。借助 kaml你可以用一行代码把 YAML 文本解析成 data class也能把 data class 直接输出为规范的 YAML 1.2 文档是处理配置文件、CI 定义等场景的轻量好工具。为什么需要 kamlKotlin 的序列化框架 kotlinx.serialization 原生支持 JSON但 YAML 在配置文件中依然无处不在。手写解析代码又累又容易出错而 kaml 帮你做到了✅双向转换YAML → Kotlin 对象反序列化、Kotlin 对象 → YAML序列化✅完整支持 YAML 1.2标量、列表、映射、空值、锚点与别名、合并键✅类型安全直接绑定到带Serializable注解的 data class✅错误定位清晰解析出错时异常会带上具体的行号和列号核心入口就是 Yaml 类它实现了 kotlinx.serialization 的StringFormat接口用起来和你熟悉的 Json 格式几乎一样。准备工作引入依赖只需两行在 Gradle 构建脚本中先启用 Kotlin 序列化插件再加入 kaml 依赖Kotlin DSL 写法plugins { kotlin(jvm) version 1.4.20 kotlin(plugin.serialization) version 1.4.20 } dependencies { implementation(com.charleskorn.kaml:kaml:版本号) }⚠️ 注意kaml 目前只完全支持 Kotlin/JVMJS 和 Native 目标仍处于实验阶段。另外项目已归档停止维护源码和已发布的构件仍可用生产使用前请留意这一点。实战例子1把 YAML 字符串解析为 data class这是最高频的用法。先定义一个Serializable数据类再用decodeFromString一步完成解析Serializable data class Team( val leader: String, val members: ListString ) val input leader: Amy members: - Bob - Cindy - Dan .trimIndent() val result Yaml.default.decodeFromString(Team.serializer(), input) println(result) // Team(leaderAmy, members[Bob, Cindy, Dan])如果 YAML 写错了怎么办kaml 抛出的YamlException见 YamlException.kt会明确告诉你出错位置比如缺少必填字段、遇到未知属性、值类型不匹配都附带了path、line、column信息排查问题非常快。实战例子2把 data class 输出为 YAML 字符串反向操作同样简单调用encodeToString即可val team Team(Amy, listOf(Bob, Cindy, Dan)) val yamlText Yaml.default.encodeToString(Team.serializer(), team) println(yamlText) // leader: Amy // members: // - Bob // - Cindy // - Dan生成的 YAML 默认使用 2 空格缩进、双引号包裹字符串、80 列自动换行格式规范且对人类友好。JVM 平台上还支持通过encodeToSink直接写入文件流适合生成配置文件的大文件场景。实战例子3不想建类直接解析为 YamlNode有时候文档结构不固定或者只想取某一个字段没必要提前定义整个数据类。kaml 支持把 YAML 解析成树形结构YamlNode按需取值val node Yaml.default.parseToYamlNode(input) println( node.yamlMap .getYamlList(members)!![1] .yamlScalar .content ) // CindyYamlNode分为三种形态YamlScalar标量、YamlList列表、YamlMap映射你可以像遍历普通集合一样逐层读取。而且拿到节点后还可以随时用decodeFromYamlNode把它转成某个 data class灵活度拉满。节点模型定义在 YamlNode.kt。实战例子4自定义配置——命名策略与宽松模式真实世界的配置文件风格各异kaml 通过YamlConfiguration提供了一组可调参数定义在 YamlConfiguration.kt常用的有两个val yaml Yaml( configuration YamlConfiguration( yamlNamingStrategy YamlNamingStrategy.SnakeCase, // 字段名按 snake_case 匹配 strictMode false, // 忽略未知属性 ) ) val config yaml.decodeFromString(GitRepoConfig.serializer(), repo_name: kaml star_count: 4000 some_new_field: ignored .trimIndent())配置项作用默认值strictMode遇到未知属性是否报错true报错yamlNamingStrategy字段名转换策略内置 SnakeCase / KebabCase / PascalCase / CamelCase无encodeDefaults序列化时是否写出默认值trueanchorsAndAliases是否允许锚点与别名防止别名炸弹禁止polymorphismStyle多态标记方式YAML tag 或 type 属性Tag命名策略的四种实现位于 YamlNamingStrategy.kt例如设为SnakeCase后serialName字段就能自动匹配 YAML 里的serial_name键。进阶能力一览掌握上面 4 个例子后你可以按需探索 kaml 的更多特性多态支持sealed 类与未封装类型都支持可用!type标签或type属性两种风格声明子类型锚点、别名与合并支持 Docker Compose 风格的x-扩展字段与:合并注释注解用YamlComment在输出 YAML 的字段前添加注释行排版控制缩进宽度、字符串换行长度、列表块状/流式风格均可配置更多用法可参考项目自带的完整测试用例比如读取场景的 YamlReadingTest.kt 和写出场景的 YamlWritingTest.kt覆盖了标量、列表、空值、多态等几乎所有边界情况。总结场景推荐用法结构固定的配置解析decodeFromString data class生成 YAML 配置encodeToString结构不定、按需取值parseToYamlNode YamlNode键名风格不一致 / 有冗余字段YamlConfiguration自定义配置kaml 的 API 与 kotlinx.serialization 保持了高度一致如果你已经熟悉 JSON 序列化学习成本几乎为零。4 个例子跑通之后YAML 配置文件对你来说就只是一份普通的 Kotlin 对象而已。【免费下载链接】kamlYAML support for kotlinx.serialization项目地址: https://gitcode.com/gh_mirrors/ka/kaml创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考