YAML 学习笔记

最近看到越来越多的 YAML 的东西,所以打算看下 YAML 语法。

介绍

官网直接强调了 YAML Ain’t Markup Language (YAML 不是标记语言),YAML 是人类友好的数据序列化对所有编程语言标准。简单说就是类似 JSON 这种数据序列化后的字符。

数据类型

集合类型

  • map 无序的 key:value 对,不允许重复。
  • omap 有序的 key:value 对,不允许重复。
  • pairs 有序的 key:value 对,允许重复。
  • set 无序集不等值的。
  • seq 任意值的序列

基本类型

  • bool 布尔型
  • float 浮点型
  • int 整型
  • null null
  • str 字符串
  • timestamp 时间戳
  • merge 指定一个或多个映射到与当前被合并。
  • yaml 自定义类型
  • value 定义默认值 (JS-YAML 不支持)
  • binary Base64数据 (JS-YAML 不支持)

JS-YAML 扩展类型

  • !!js/regexp 正则表达式
  • !!js/undefined undefined
  • !!js/function 函数

具体请参考 Language-Independent Types for YAML

语法

除了数据类型,还有几个简单的语法。

空格 使用空格缩进来表示结构,不能使用 TAB
— 文件开始 (可有可无)
… 文件结束 (可有可无)
# 注释
| 字符串保留换行
> 字符串折叠换行

额,,符号比较多,还是直接看例子算了。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
list: # 我是注释
-
name: 张三
birthday: !!str 1990-1-1
sex:
intro: |
我是张三,来至地球。
喜欢做饭。
-
name: 李四
birthday: 1990-2-2
sex:
intro: >
我是李四,来至地球。
喜欢吃饭。

输出

1
2
3
4
5
6
7
8
9
{ list:
[ { name: '张三',
birthday: '1990-1-1',
sex: '男',
intro: '我是张三,来至地球。\n喜欢做饭。\n' },
{ name: '李四',
birthday: Fri Feb 02 1990 08:00:00 GMT+0800 (CST),
sex: '女',
intro: '我是李四,来至地球。 喜欢吃饭。\n' } ] }

可以看到 !!str 强制使用字符串后,他就不会转义为日期对象了,否则就是日期对象。
上面列出来的 数据类型 在适当的时候用,可以控制我们生成的数据类型。

还有 | 和 > 的区别,就是是否保留行内的换行。

另外还有一个坑,当你的字符串里出现了 : 或者字符串前后需要保留空格,就需要使用 “ 或 ‘ 来防止错误和保留前后的空格。

1
str: '  str:str  '

好了,更多奇葩的用法还是自己去测试吧。

JS-YAML

JS-YAML 是 js 的 YAML 解析插件,你可以直接在 JS-YAML demo 页面测试以上例子。

结束语

整体来说,YAML 也比较简单而且类型丰富,学学也无妨,技多不压身嘛。