大家好,欢迎来到停止重构的频道。
本期介绍Yaml。
Yaml跟Json一样,是一种文本数据格式,常用于配置文件,比如K8S的配置、SpringBoot的配置等。

一般情况下,Yaml和Json可以表达相同的树形结构数据,也就是他们一般是可以相互转换的。
相对于Json,Yaml拥有更强的可读性,Json通过{}、[]表示层级关系,Yaml则采用换行、缩进表示层级关系。
整体上,Yaml更加简洁、易读,可以简单地理解为 Yaml是Json的易读增强版。

以下详细内容是基于Json做对比讲解的,所以在继续了解下面内容之前,请先确保已经对Json有所了解。
如果你能清晰地理解这样的Json例子,则不需要翻看往期《Json详解》。

以下基于Yaml1.2版本介绍。
1.2版本发布于2009年,目前几乎所有的Yaml解析器都基于这个版本进行解析的。

提纲
我们按以下顺序展开:
- 对象、数组
- 字符串
- 数字、布尔值、null
- 其他类型及tag标签
- 注释和空行
- 锚点/引用
- 多文档
对象、数组
先介绍对象、数组的变化。
Json的对象是通过"{}"包裹的,Yaml则采用换行/缩进进行标识的。
图中nested这个key对应的值为对象。
YAML只需要换行,且key 1/key 2前面拥有一样数量的空格即可,也就是一样空格数量前缀的行会被认为是同一层级的对象。

值得一提的是,Yaml的缩进是只允许使用空格的,不支持tab制表符。
但是你会发现,在VSCode等代码编辑器中使用tab键缩进是没问题的,因为VSCode这些代码编辑器,会强制将tab键的输入改为两个或4个空格。

Yaml对象中的键值对采用": "分割,也就是":"后必须加一个空格。

Json的数组是由"[]"包裹,Yaml的数组是采用换行/缩进进行标识,每个数组元素需要以"- "开头。
如果数组元素是对象,则如图所示,注意用空格对齐对象中key的缩进。

以上是Yaml推荐的对象/数组设置方式,如果你就是要插入Json格式数据,Yaml也是支持的,但必须是一行内写完。

字符串
接下来介绍字符串。
Json是要求字符串必须由""包裹的,但是,Yaml则不要求必须使用""包裹字符串。

Json字符串中的双引号需要转义,Yaml字符串中的双引号则不需要转义。

如果字符串以空格开头或空格结尾,Yaml字符串需要用""或者''包裹,也就是""或者''包裹的部分,会强制认为是字符串。

""和''的区别。
双引号是会转义的,等效Json的双引号,\n会转义为换行符。
而单引号是不会转义的,\n不会转义为换行符。

对于多行字符串,Json只能通过\n标识换行,Yaml则支持换行字符串。
Yaml用"|"标识多行字符串。多行字符串是以第一行的空格前缀作为对齐的,所以第二行会认为前面有1个空格。

如果第一行的前面需要有空格的话,则需要在"|"后标识缩进的空格数。

如果不希望最后一行换行的话,则需要在"|"后增加"-"标识。

若希望将多行字符串的换行替换为空格,可以采用">"代替"|"。

数字、布尔值、null
接下来是常规的数字、布尔值、null类型数据,这部分相对于Json没有多大的变化。
数字就是普通的数字,直接设置就可以了。
布尔值除了Json支持的小写true/false,Yaml还支持大写的TRUE/FALSE。
null除了可以设置为null,还可以设置为~。

其他类型及tag标签
除了以上6种Json也支持的基础数据类型。
YAML还支持一些特殊的类型,比如时间类型、二进制类型等,这些特殊类型数据是无法转换为Json数据的。
其中,二进制类型数据的!!binary是用于指定类型的tag标签。

类似的,Yaml中可以使用tag标签指定值类型,一些解析器可能会有自定义的特殊值类型,不过这个知道就行了,一般是用不上的。

注释和空行
Json是不支持注释的,只能通过加额外的key达到类似于注释的作用。
而Yaml支持通过"#"添加注释的,"#"开头的内容会被认为是注释。
与Json一样,Yaml中的空行是会被忽略的,不会影响到解析。

锚点/引用
在Json中,若有一段重复的数据,你只能写多次。
但是Yaml中,是允许只写一次,别的地方可以重复引用的。也就是定义锚点,然后再多处引用锚点。
但是这种节省数据重复填写的方式并不都是好的,在数据结构复杂,且定义了多个锚点后,是非常难以阅读的。

多文档
最后是Yaml的多文档,一个Json文件只能是一个数据结构。
但是Yaml是允许一个文件中设置多个数据结构的,采用---分隔多个文档。
但是吧,不太常用,因为某个数据太长的话,可能很难分清楚哪里跟哪里是一个文档,所以很多软件对Yaml配置文件的支持,会屏蔽掉这个功能。

总结
以上就是Yaml的介绍,它相对于Json更易读,主要优点是使用换行/缩进代替Json的{}/[],让内容更加紧凑。

当然,Json也不是一无是处,虽然Yaml更易读,但同时也会有很多限制和多余语法。
而Json却极致简单,极容易理解,普及度会更高。
比如Python的标准库是含有Json解析器的,但是不包含Yaml的解析器。

1075

被折叠的 条评论
为什么被折叠?



