概览
官网
文档
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实质上是一种通用的数据串行化格式。
形同点:
1、YAML和JSON都是便于人阅读的数据交换格式。
不同点:
1、JSON设计主要在于简单和通用。YAML设计主要在于易于阅读和支持任何复杂的数据结构。
2、YAML可以视为JSON的超集,提供更易于阅读和复杂的信息模型。
3、每个JSON文件都是一个YAML文件,从JSON到YAML迁移是很容易的事情。
YAML主要是数据序列号语言。XXML设计是对SGML的向后兼容。XML有设计约束,而YAML没有。
基本语法规则
注释#
对象
对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
1 2 3 4 5 6 7 8 9 10 11
| animal: pets
转为 JavaScript 如下 { animal: 'pets' }
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 }
isSet: true
转为 JavaScript 如下 { isSet: true }
parent: ~
转为 JavaScript 如下 { parent: null }
iso8601: 2001-12-14t21:59:43.10-05:00
转为 JavaScript 如下 { iso8601: new Date('2001-12-14t21:59:43.10-05:00') }
date: 1976-07-31
转为 JavaScript 如下 { date: new Date('1976-07-31') }
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' }
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 is a YAML processor for the Java Virtual Machine.
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
| 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.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"; 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")); 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(); } }
|