概览

官网

文档

YAML Ain't Markup Language
YAML is a human friendly data serialization standard for all programming languages.

http://www.ruanyifeng.com/blog/2016/07/yaml.html

YAML实质上是一种通用的数据串行化格式。

YAML JSON 与 XML

形同点:

1、YAML和JSON都是便于人阅读的数据交换格式。

不同点:

1、JSON设计主要在于简单和通用。YAML设计主要在于易于阅读和支持任何复杂的数据结构。

2、YAML可以视为JSON的超集,提供更易于阅读和复杂的信息模型。

3、每个JSON文件都是一个YAML文件,从JSON到YAML迁移是很容易的事情。

YAML主要是数据序列号语言。XXML设计是对SGML的向后兼容。XML有设计约束,而YAML没有。

基本语法规则

  • 大小写敏感

  • 使用缩进表示层级关系

  • 缩进时不允许使用Tab键,只允许使用空格。

  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

注释#

对象

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

1
2
3
4
5
6
7
8
9
10
11
#对象的一组键值对,使用冒号结构表示。
animal: pets

转为 JavaScript 如下
{ animal: 'pets' }

#Yaml 也允许将所有键值对写成一个行内对象
hash: { name: Steve, foo: bar }

转为 JavaScript 如下
{ hash: { name: 'Steve', foo: 'bar' } }

数组

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#一组连词线开头的行,构成一个数组
- Cat
- Dog
- Goldfish

转为 JavaScript 如下
[ 'Cat', 'Dog', 'Goldfish' ]

#数据结构的子成员是一个数组,则可以在该项下面缩进一个空格
-
- Cat
- Dog
- Goldfish

转为 JavaScript 如下
[ [ 'Cat', 'Dog', 'Goldfish' ] ]

#数组也可以采用行内表示法
animal: [Cat, Dog]

转为 JavaScript 如下
{ animal: [ 'Cat', 'Dog' ] }

对象和数组复合结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
languages:
- Ruby
- Perl
- Python
websites:
YAML: yaml.org
Ruby: ruby-lang.org
Python: python.org
Perl: use.perl.org

转为 JavaScript 如下
{ languages: [ 'Ruby', 'Perl', 'Python' ],
websites:
{ YAML: 'yaml.org',
Ruby: 'ruby-lang.org',
Python: 'python.org',
Perl: 'use.perl.org' } }

纯量

纯量(scalars):单个的、不可再分的值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#数值直接以字面量的形式表示
number: 12.30

转为 JavaScript 如下
{ number: 12.30 }

#布尔值用true和false表示
isSet: true

转为 JavaScript 如下
{ isSet: true }

#null用~表示
parent: ~

转为 JavaScript 如下
{ parent: null }

#时间采用 ISO8601 格式
iso8601: 2001-12-14t21:59:43.10-05:00

转为 JavaScript 如下
{ iso8601: new Date('2001-12-14t21:59:43.10-05:00') }

#日期采用复合 iso8601 格式的年、月、日表示
date: 1976-07-31

转为 JavaScript 如下
{ date: new Date('1976-07-31') }

#YAML 允许使用两个感叹号,强制转换数据类型。
e: !!str 123
f: !!str true

转为 JavaScript 如下
{ e: '123', f: 'true' }

字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#字符串默认不使用引号表示
str: 这是一行字符串

转为 JavaScript 如下
{ str: '这是一行字符串' }

#如果字符串之中包含空格或特殊字符,需要放在引号之中
str: '内容: 字符串'

转为 JavaScript 如下
{ str: '内容: 字符串' }

#单引号和双引号都可以使用,双引号不会对特殊字符转义
s1: '内容\n字符串'
s2: "内容\n字符串"

转为 JavaScript 如下
{ s1: '内容\\n字符串', s2: '内容\n字符串' }

#单引号之中如果还有单引号,必须连续使用两个单引号转义
str: 'labor''s day'

转为 JavaScript 如下
{ str: 'labor\'s day' }

#字符串可以写成多行,从第二行开始,必须有一个单空格缩进。换行符会被转为空格
str: 这是一段
多行
字符串

转为 JavaScript 如下
{ str: '这是一段 多行 字符串' }

#多行字符串可以使用|保留换行符,也可以使用>折叠换行
this: |
Foo
Bar
that: >
Foo
Bar

转为 JavaScript 代码如下
{ this: 'Foo\nBar\n', that: 'Foo Bar\n' }

#+表示保留文字块末尾的换行,-表示删除字符串末尾的换行
s1: |
Foo

s2: |+
Foo


s3: |-
Foo

转为 JavaScript 代码如下
{ s1: 'Foo\n', s2: 'Foo\n\n\n', s3: 'Foo' }

#字符串之中可以插入 HTML 标记
message: |

<p style="color: red">
段落
</p>

转为 JavaScript 如下
{ message: '\n<p style="color: red">\n 段落\n</p>\n' }

引用

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
defaults: &defaults
adapter: postgres
host: localhost

development:
database: myapp_development
<<: *defaults

test:
database: myapp_test
<<: *defaults

等同于下面的代码

defaults:
adapter: postgres
host: localhost

development:
database: myapp_development
adapter: postgres
host: localhost

test:
database: myapp_test
adapter: postgres
host: localhost
1
2
3
4
5
6
7
8
- &showell Steve
- Clark
- Brian
- Oren
- *showell

转为 JavaScript 代码如下
[ 'Steve', 'Clark', 'Brian', 'Oren', 'Steve' ]

js-yaml

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

Java解析:

snakeYAML

文档

SnakeYAML is a YAML processor for the Java Virtual Machine.

Fastjson API

Fastjson是一个Java语言编写的JSON处理器。

FastJSON 简介及其Map/JSON/String 互转

参考资料

Yaml for Java

HashMap详细介绍(源码解析)和使用示例

mac版jdk安装及版本切换

Maven仓库

Gradle

映射到JavaBean:

snakeyaml读取yaml配置文件

使用SnakeYAML读取yaml配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//官方文档的demo
package examples;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSON;

import junit.framework.TestCase;

// import org.junit.Test;
import org.yaml.snakeyaml.Yaml;

public class LoadExampleTest extends TestCase {
@SuppressWarnings("unchecked")
public void testLoad() {
Yaml yaml = new Yaml();
String document = "\n- Hesperiidae\n- Papilionidae\n- Apatelodidae\n- Epiplemidae";
//converts a YAML document to a Java object
List<String> list = (List<String>) yaml.load(document);
System.out.println(list);
System.out.println(list.toString());
assertEquals("[Hesperiidae, Papilionidae, Apatelodidae, Epiplemidae]", list.toString());
}

public void testLoadFromString() {
Yaml yaml = new Yaml();
String document = "hello: 25";
@SuppressWarnings("unchecked")
Map<String, Integer> map = (Map<String, Integer>) yaml.load(document);
System.out.println(map);
System.out.println(map.get("hello"));
//Map -> JSON
String json = JSON.toJSONString(map,true);
System.out.println(json);

assertEquals("{hello=25}", map.toString());
assertEquals(Integer.valueOf(25), map.get("hello"));
}

public void testLoadFromStream() throws IOException {
InputStream input = new FileInputStream(new File("src/test/resources/utf-8.txt"));
Yaml yaml = new Yaml();
Object data = yaml.load(input);
assertEquals("this is a utf-8.txt file", data);
//
data = yaml.load(new ByteArrayInputStream("test2".getBytes("UTF-8")));
assertEquals("test2", data);
input.close();
}

public void testLoadManyDocuments() throws IOException {
InputStream input = new FileInputStream(
new File("src/test/resources/example.yaml"));
Yaml yaml = new Yaml();
int counter = 0;
for (Object data : yaml.loadAll(input)) {
System.out.println(data);
String json = JSON.toJSONString(data, true);
System.out.println(json);
assertNotNull(data);
assertTrue(data.toString().length() > 1);
counter++;
}
assertEquals(3, counter);
input.close();
}
}