SnakeYAML引擎 中文文档

2024-01-16

安装

如果使用Maven,只需添加如下依赖描述:参考这里

教程

加载YAML

使用构建者模式来创建org.snakeyaml.engine.v2.api.LoadSettings实例不可变对象:


LoadSettings settings = LoadSettings.builder().setLabel("自定义用户配置").build();

创建org.snakeyaml.engine.v2.api.Load实例:


Load load = new Load(settings);

org.snakeyaml.engine.v2.api.Load实例支持三种源加载:

InputStream不包含编码信息,需要通过BOM(字节顺序标记)序列在流开始检测编码。如果没有BOM,默认使用UTF-8编码。

Reader和字符串定义了编码,BOM不应出现(会作为数据处理)。

这些方法可以将YAML文档转换为Java对象:


Load load = new Load(settings);

String document = "\n- Hesperiidae\n- Papilionidae\n- Apatelodidae\n- Epiplemidae";

List<String> list = (List<String>) yaml.loadFromString(document);

System.out.println(list);

['Hesperiidae', 'Papilionidae', 'Apatelodidae', 'Epiplemidae']

详见例子

隐式类型

如果标记节点没有显式定义,SnakeYAML引擎会试图通过正则表达式匹配内容来检测类型,第一个匹配则解析为该类型。


1.0 -> Double

42 -> Integer

null -> null

false -> boolean 

仅支持JSON模式

隐式标记会在获取到任何其他关于标量的信息后忽略。

您说得对,我确实忘记翻译Dumping相关内容,现在补充翻译如下:

输出YAML

使用构建者模式来创建可变的org.snakeyaml.engine.v2.api.DumpSettings实例:


DumpSettings settings = DumpSettings.builder()

  .setDefaultScalarStyle(ScalarStyle.DOUBLE_QUOTED)

  .build();

创建org.snakeyaml.engine.v2.api.Dump实例:


Dump dump = new Dump(settings);

方法Dump.dumpToString()接受一个实例并返回其YAML文档。方法Dump.dumpAllToString()接受一个java.util.Iterator并返回包含所有文档的YAML流。文档通过DumpSettings指定分隔。

为支持输出到流,Dump提供dump()dumpAll()。它们采用继承java.io.Writer但不抛出IO异常的StreamDataWriter作为参数。这意味着用户需要创建接口的实现并处理捕获IO异常。

在测试中可以找到工作示例

生成自定义YAML文档

TODO

构造器、表示方法、解析器

TODO

枚举

SnakeYAML支持将枚举映射到YAML。

本地标签可以直接将枚举直接映射到相应语言的枚举类型,例如:


!java.lang.Enum ExampleEnum

也可以将枚举表示为map:


!map

  a: VALUE1 

  b: VALUE2

全局标签可以使用类似以下格式:


!!fully.qualified.name.of.Enum

  a: VALUE1

  b: VALUE2 

例子可以在这里找到。

线程安全性

实现不是线程安全的。不同线程不能调用同一个实例。线程必须有独立的Load或Dump实例。

底层API

可以对字符流进行解析或组装。解析示例在这里,组装示例在这里

标签

显式标签可以是本地标签(开始于单个感叹号’!’)和全局标签(开始于双感叹号’!!’)。全局标签在单个编程语言内工作良好,因为可以在没有额外配置的情况下解析。本地标签需要额外上下文。由于每个解析器在运行时都必须提供更多信息来创建实例,所以本地标签有助于YAML文档在不同语言间交换(每个解析器都可以自行决定对!car作何处理)。

隐式标签会为每个标量自动分配。可以添加自定义隐式标签解析规则。在创建标量时会采用以下顺序:

  1. 显式标签 - 存在时使用

  2. 隐式标签 - 当运行时类不明时使用

如果上述都不匹配,则默认解析为tag:yaml.org,2002:str(作为字符串解析)。

例子可在这里找到。

YAML语法

YAML语法的很好入门介绍见规范章节2

这里简要介绍最常见的YAML结构和对应的Java对象:

块序列

在块上下文,序列项用“-”(破折号后跟一个空格)表示:


# YAML

- Mark McGwire

- Sammy Sosa

- Ken Griffey

["Mark McGwire", "Sammy Sosa", "Ken Griffey"]

块序列可以嵌套:


# YAML

-

  - HTML

  - LaTeX

  - SGML

  - VRML

  - XML

  - YAML

-

  - BSD

  - GNU Hurd

  - Linux

[['HTML', 'LaTeX', 'SGML', 'VRML', 'XML', 'YAML'], ['BSD', 'GNU Hurd', 'Linux']]

嵌套序列项不必另起一行:


# YAML

- 1.1

- - 2.1

  - 2.2

- - - 3.1

    - 3.2

    - 3.3

[1.1, [2.1, 2.2], [[3.1, 3.2, 3.3]]]

块映射

在块上下文,映射项用“:”(冒号后跟一个空格)表示键值对:


# YAML 

hr: 65

avg: 0.278

{"hr": 65, "avg": 0.278}

可支持复杂键:


# YAML

? !!python/tuple [0,0]

: The Hero

? !!python/tuple [0,1] 

: Treasure

{(0, 0): 'The Hero', (0, 1): 'Treasure'}

块映射也支持嵌套:


# YAML

hero:

  hp: 34

  sp: 8

  level: 4

orc:

  hp: 12

  sp: 0

  level: 2

{"hero": {"hp": 34, "sp": 8, "level": 4}, "orc": {"hp": 12, "sp": 0, "level": 2}} 

流集合

流序列用“[”和“]”包围,项间用“,”分隔:


# YAML

[ one, two, ]

["one", "two"]

流映射用“{”和“}”包围,键值对间用“,”分隔:


# YAML

{ key: value }

{"key": "value"}

标量样式

YAML提供5种标量样式:

每个样式各有优点,主要区别在于是否支持换行和转义。

标签

标签以“!”表示,可以是显式标签或者使用缩写:


# 显式 

!!null null

# 缩写

!!bool true

缺失标签会被解析为特定类型。

YAML语法与Java类型映射

下表描述不同标签节点在Java中的表现:


| YAML标签       | Java类型                  |

| -------------- | ------------------------- |

| 标准YAML标签   |                           |

| !!null         | null                      |

| !!bool         | Boolean                   |

| !!int          | Integer, Long, BigInteger |

| !!float        | Double                    |

| !!binary       | byte[], String            |

| !!omap,!!pairs | List ofObject[]           |

| !!set          | Set                       |

| !!str          | String                    |

| !!seq          | List                      |

| !!map          | Map                       |

默认集合实现:

可以定义其他默认实现。

YAML与Java类型相对应

以下贴出一些常见映射:


# YAML

- Mark McGwire

- Sammy Sosa 

# Java

["Mark McGwire", "Sammy Sosa"]

# YAML 

hr: 65

avg: 0.278

# Java

{"hr": 65, "avg": 0.278}

# YAML

true

false 

# Java 

true

false

# YAML

0

3

-1

# Java

0

3 

-1

# YAML

0. 

1.2e3

# Java

0.0

1200.0

详见例子

YAML语法与特定语言绑定

YAML处理器往往提供特定语言的本地标签,比如:


!ruby/object Ruby::Set

这类标签直接绑定到语言原生类型上。

同时也支持全局标签,比如:


!!tag:yaml.org,2002:set 

这类标签在不同语言间互操作。

值得注意的是,通过本地标签也可以实现跨语言互操作。例如:


%TAG !ruby/object !!

会把本地标签映射到全局域名定义的类型上。

合并

YAML定义了“合并”语义,详见http://yaml.org/type/merge.html。

但是SnakeYAML已经移除了对该语义的支持,因为它在YAML 1.2中不再推荐使用。


译者:Claude

校对:devzhi

原文:https://bitbucket.org/snakeyaml/snakeyaml-engine/wiki/Documentation#markdown-header-constructors-representers-resolvers