官网
官方文档
在线工具
参考资料
YAML 官方解释:YAML Ain’t Markup Language,即 YAML 不是标记语言。
YAML 是一个可以用于所有编程语言的可读性非常好的序列化标准。YAML 广泛用于配置文件。
已经实现 YAML 的语言有:Ruby,Java,Perl,Python,PHP,JavaScript。
YAML 有以下优点:
XML 解析效率比 YAML 低,但是 XML 支持自定义的数据类型,有大量额外的工具来验证它的格式。
XML 和 YAML 之间没有直接的关联。
YAML 主要是一种数据序列化语言。XML 旨在向后兼容支持结构化文档的标准通用标记语言(Standard Generalized Markup Language,SGML)。 因此,XML 有许多设计限制。XML 是许多领域的先驱,YAML 从 XML 和其他技术中汲取经验教训。
JSON 中使用了 {}
和 []
,难以手工维护 JSON 文件,而 YAML 使用空格缩进,既易读又易维护。
JSON 和 YAML 都旨在成为人类可读的数据交换格式。但是,JSON 最重要的设计目标是简单和通用性,并以减少可读性为代价实现这个目的。
YAML 最重要的设计目标是可读性和对序列化任意本地数据结构的支持。因此,YAML 文件非常易读,但是生成和解析过程变得更复杂。另外,在不同编程环境之间交叉使用 YAML 需要更复杂的处理,所以如果跨语言交互数据,请使用 JSON。
YAML 可以被视为 JSON 的超集,提供更优的可读性和更完整的信息模型。实际情况也是如此,每个 JSON 文件也是一个有效的 YAML 文件。如果有需要,可以轻松地从 JSON 迁移到 YAML。
YAML 使用可打印的 Unicode 字符(即非控制字符),支持 UTF-8 和 UTF-16 两种编码。
YAML 使用三个破折号(“—”)将分隔文档中的指令。如果没有指令存在,这也用于指示文档的开始。三个点(“…”)表示文档的结束,表示通信通道中不会再有新文档了。
例如,一个文件中的两个文档:
# Ranking of 1998 home runs
---
- Mark McGwire
- Sammy Sosa
- Ken Griffey
# Team ranking
---
- Chicago Cubs
- St Louis Cardinals
#
表示注释,从这个字符一直到行尾,都会被解析器忽略。key: value
。- break: lunch
YAML 支持的数据结构有三种。
对象由键值对组成,使用冒号分隔。
标量组成的对象:
hr: 65 # 相当于 JSON 的 {"hr":65}
YAML 也允许将所有键值对写成一个行内对象:
people: { name: Steve, age: 30 } # 相当于 JSON 的 {"people":{"name":"Steve", "age":30}}
一组相同缩进的破折号开头的行,构成一个数组。例如,标量组成的数组:
- Mark McGwire
- Sammy Sosa
- Ken Griffey
数组可以嵌套:
-
- Mark McGwire
- Sammy Sosa
- Ken Griffey
第一个例子相当于 JSON 中的 [“Mark McGwire”, “Sammy Sosa”, “Ken Griffey”],第二个相当于 [[“Mark McGwire”, “Sammy Sosa”, “Ken Griffey”]]。
跟对象类似,也可以将数组的所有元素写在一行:
people: [Mark, Ken]
name: jack
。例外: name: jack li
name: "jack \n line"
name: 'jack''s name'
isAdult: true
age: 33
~
表示,例如:name: ~
iso8601: 2001-12-14t21:59:43.10-05:00
date: 1976-07-31
YAML 使用两个感叹号强制转换数据类型:
name: !!str true # 相当于 JSON 的 {"name":"true"}
&
用来建立锚点(defaults),需要同时指定锚点的名字。<<
表示合并到当前数据,*
用来通过名字引用锚点。示例:
# 相当于 JSON 的 [ { x: 1, y: 2 }, { x: 1, y: 2, r: 10, label: 'center' } ]
- &CENTER { x: 1, y: 2 }
- # Merge one map
<< : *CENTER
r: 10
label: center