快速了解 YAML

时间:2022-05-07
本文章向大家介绍快速了解 YAML,主要内容包括对象、数组、字符串、引用、强制类型转换、注释、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

什么是 YAML?

YAML 是一个数据序列化的标准,适用于所有开发语言,最大的特点是可读性好

YAML 的一个主要应用方向就是编写配置文件,有非常多的系统和框架采用YAML进行配置

示例

title : yaml test

date : 2016/08/06

content : hello yaml

这就是一个最简单的YAML文件,非常好理解

YAML 对比 XML/JSON

从示例可以看出 YAML 和 XML/JSON 比较类似,那么他们的关系是什么呢?

XML由大量标签构成,YAML则轻便很多,但没有DTD概念,不能像XML那样验证数据格式

对于YAML和XML,可以简单的理解为:

XML很啰嗦,YAML简洁清晰,好理解,但XML的啰嗦也是有好处的,便于验证数据

YAML中也是支持JSON格式的,例如

Button: {name: button2, text: Button 2}

但YAML比JSON的可读性更好,例如

arr :
  - a:
        a1 : 1
        a2 :
            - 2
            - 3
  - b

比较好理解,arr 是一个数组,有 a 和 b 两个元素,其中 a 又包含两个元素,a2 是一个数组

JSON格式是这样的

{
    arr: [
        {
            a: {
                a1: 1,
                a2: [2, 3]
            }
        },
        'b'
    ]
}

大量的 {} 与 [] 嵌套很容易让人看不清楚

除了比JSON更好读,YAML还有更多的功能,后面介绍语法时可以看到

如何使用 YAML?

--JS
<script src="esprima.js"></script>
<script src="js-yaml.min.js"></script>
<script type="text/javascript">
var doc = jsyaml.load('greeting: hello');
</script>
--Node.js
yaml = require('js-yaml');
fs = require('fs');
try {
  var doc = yaml.safeLoad(fs.readFileSync('/home/example.yml', 'utf8'));
  console.log(doc);
} catch (e) {
  console.log(e);
}
--JAVA
JYaml库的官方示例
date: 11/29/2005
receipts:
    - store: ken stanton music
        category: entertainment
        description: saxophone repair
        total: 382.00
    - store: walmart
        category: groceries
        total: 14.26

映射关系

解析代码

Entry entry = Yaml.loadType(
 new File("ReceiptEntry.yml"), Entry.class);

YAML 基础语法

需要注意的是,YAML使用空格进行缩进,表达上下级关系,所以空格不是用来美化代码的,而是语法的一部分

对象

name : YAML

解析为JS对象:

{ name: 'YAML' }
User : 
    name : Bill
    age : 30

解析为JS对象:

{ User: { name: 'Bill', age: 30 } }

数组

- a

- b

- c

解析为JS对象:

[ 'a', 'b', 'c' ]
items:
    - id: 1
      price: 1.1
    - id: 2
      price: 2.2

解析为JS对象:

{ items:[ 
{ id: 1, price: 1.1 }, 
{ id: 2, price: 2.2 } 
] }

字符串

字符串可以不使用引号,直接写

str : hello world

如果包含特殊字符(如 :),就要放在引号中

str : '包含: abc'

字符串可以写成多行,换行符会被解析为空格,如

str: 我

解析为JS对象:

{ str: '我 是 谁' }

如果想保留换行符,需要使用符号 '|'

str: |

解析为JS对象:

{ str: '我n是n谁n' }

多行字符串末尾的换行符可以选择保留或者删除,例如

str1: |+

保留换行符

str2: |-

删除换行符

解析为JS对象:

{ str1: '保留换行符nnn', str2: '删除换行符' }

+ 保留末尾的换行

- 删除末尾的换行

引用

sign: &sign

name: Gates

email: g@a.com

A:

content: aaa

<<: *sign

B:

content: bbb

<<: *sign

解析为JS对象:

{ sign: { name: 'Gates', email: 'g@a.com' },

A: { content: 'aaa', name: 'Gates', email: 'g@a.com' },

B: { content: 'bbb', name: 'Gates', email: 'g@a.com' } }

& 用来建立锚点(sign)

<< 表示合并到当前数据

* 用来引用锚点

强制类型转换

num: !!str 123

解析为JS对象:

{ num: '123' }

!! 表示类型转换,后面跟上要转换的类型

注释

# key: value

Block: Kiki

# 表示注释

资源推荐

YAML官网

http://www.yaml.org/

yaml-js 即时解析工具

http://nodeca.github.io/js-yaml/