3 YAML 基础语法

Wu Jun 2020-02-12 16:51:18
16 辅助工具类 > 4 数据格式

在线 YAML、JSON 互转:http://nodeca.github.io/js-yaml/

YAML(发音 /ˈjæməl/ )是"YAML Ain’t a Markup Language"的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”,但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。

1 基本规则

  1. 大小写敏感
  2. 使用缩进表示层级关系
  3. 禁止使用 tab 缩进,只能使用空格键
  4. 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  5. 使用 # 表示注释
  6. 字符串可以不用引号标注

2 三种数据结构

2.1 对象

键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)

对象的一组键值对,使用冒号结构表示。

# JSON 表示
{'age':12,'name':'huang'}

# YAML 多行表示
age : 12
name : huang

# YAML 行内表示
{age:12, name:huang}

2.2 List 数组

一组按次序排列的值,又称为序列(sequence) / 列表(list)

一组连词线开头的行,构成一个数组。

# JSON 表示
['a','b',12]

# YAML 多行表示
- a
- b
- 12

# YAML 行内表示
[a, b, c]

2.3 Scalar 纯量

纯量是最基本的、不可再分的值。

1)其它
2)字符串
引号
# YAML 表示
s1: '内容\n字符串'
s2: "内容\n字符串"
str: 'labor''s day' 

# JSON 表示
{ s1: '内容\\n字符串', s2: '内容\n字符串', str: 'labor\'s day' }
单字符串换行
# YAML 表示
str: 这是一段
  多行
  字符串

# JSON 表示
{ str: '这是一段 多行 字符串' }
多行字符串
# YAML 表示
this: |
  Foo
  Bar
that: >
  Foo
  Bar

# JSON 表示
{ this: 'Foo\nBar\n', that: 'Foo Bar\n' }
# YAML 表示
s1: |
  Foo
s2: |+
  Foo
s3: |-
  Foo

# JSON 表示
{ s1: 'Foo\n', s2: 'Foo\n\n\n', s3: 'Foo' }
HTML

字符串之中可以插入 HTML 标记。

# YAML 表示
message: |
  <p style="color: red">
    段落
  </p>

# JSON 表示
{ message: '\n<p style="color: red">\n  段落\n</p>\n' }
3)强制转换

YAML 允许使用两个感叹号,强制转换数据类型。

# YAML 强制转换
e: !!str 123
f: !!str true

# 转为 JSON 如下。
{ e: '123', f: 'true' }

3 数据结构嵌套

Map 和 List 的元素可以是另一个 Map 或者 List 或者是纯量。由此出现 4 种常见的数据嵌套:

3.1 Map 嵌套 Map

# JSON 表示
{ 
    websites: 
   { 
        YAML: 'yaml.org',
        Ruby: 'ruby-lang.org',
        Python: 'python.org',
        Perl: 'use.perl.org' 
    } 
}

# YAML 表示
websites:
  YAML: yaml.org 
  Ruby: ruby-lang.org 
  Python: python.org 
  Perl: use.perl.org 

3.2 Map 嵌套 List

# JSON 表示
{ languages: [ 'Ruby', 'Perl', 'Python', 'c' ] }

# YAML 表示
languages:
  - Ruby
  - Perl
  - Python 
  - c

3.3 List 嵌套 List

# JSON 表示
[ [ 'Ruby', 'Perl', 'Python' ], [ 'c', 'c++', 'java' ] ]

# YAML 表示 1
-
  - Ruby
  - Perl
  - Python 
- 
  - c
  - c++
  - java

# YAML 表示 2
- - Ruby
  - Perl
  - Python 
- - c
  - c++
  - java

# YAML 表示 3
- [Ruby,Perl,Python]
- [c,c++,java]

3.4 List 嵌套 Map

# JSON 表示
[ { id: 1, name: 'huang' }, { id: 2, name: 'liao' } ]

# YAML 表示
-
  id: 1
  name: huang
-
  id: 2
  name: liao

4 引用

& 用来建立锚点(defaults),<< 表示合并到当前数据,* 用来引用锚点。

defaults: &defaults
  adapter:  postgres
  host:     localhost

development:
  database: myapp_development
  <<: *defaults

- &showell Steve 
- Clark 
- Brian 
- Oren 
- *showell 

等同于下面的代码。

defaults:
  adapter:  postgres
  host:     localhost

development:
  database: myapp_development
  adapter:  postgres
  host:     localhost

[ 'Steve', 'Clark', 'Brian', 'Oren', 'Steve' ]

5 来源