YAML简易介绍
目录
快速语法
- 支持Unicode、UTF-8、UTF-16编码
- 使用空白字符为文件缩进表示结构,不支持tab字符
- 注释使用(#)开始,可以出现在一行中的任何位置,作用范围为一行
- 数组成员以单行表示,使用短杠+空白(- )开始,或者使用内置语法([]),并用逗号与空白隔开(, )
- 键值对成员使用冒号+空白(: )分开键值内容,或者使用内置语法({}),并用逗号+空白(, )隔开
- 键值对也可以用问号作为起始符号(?)用来明确表示多个词汇组成的键值
- 字符串一般不需要添加引号,但在必要时可以使用双引号(“)或者单引号(‘)框住
- 使用双引号表示字符时,可用反斜杠(\)表示转义字符
- 区块的字符串用缩进和修饰符(非必要)来和其他数据分隔,有新行保留(preserve)(使用符号 | )或新行折叠(flod)(使用符号 > )两种方式。
- | 分隔的多行文字中的换行符将被保存
- > 分隔的文字中换行符将被转换为空白字符,缩进将被略去。
- 单一文件中,可使用(—)区分多个文件
- 必要时可以使用(…)表示文件结尾
- 重复内容可以使用参考标记(*)复制到锚点标记(&)
- 指定格式可以使用两个感叹号(!!)接上名称
- 文件中的单一文件可以使用指导指令,使用方法是百分比符号(%)。有两个指导指令在YAML1.1版中被定义:
- %YAML,用来识别文件的YAML版本
- %TAG,用在URL的前缀标记
- 使用逗号或者冒号时,后面必须接一个空白字符,所以可以在字符串或者数值中自由加入分隔符号而不需要使用引号
- @ 和 ` 字符在YAML中被保留
基本组件简易教程
数组
#非内置语法表示:
- item1
- item2
- item3
#内置语法表示:
[item1, item2, item3]
键值对
#非内置语法表示
key: value
numberKey: 123
#内置语法表示:
{key: value, numberKey: 123}
多行字符串
#保留换行符模式:
string: |
There once was a man from Darjeeling
Who got on a bus bound for Ealing
It said on the door
"Please don't spit on the floor"
So he carefully spat on the ceiling
#折叠换行符模式:
string: >
Wrapped text
will be folded
into a single
paragraph
Blank lines denote
paragraph breaks
嵌套
#于数组中使用键值对(非内置语法):
- key: value
numberKey: 123
#于数组中使用键值对(内置语法):
- {key: value, numberKey: 123}
#于键值对中使用数组(非内置语法):
key:
- value1
- value2
#于键值对中使用数组(内置语法):
key: [value1, value2]
开头结尾以及注释
--- #文件分隔,本内容为注释内容
key: value
numberKey: 123
array:
- item1
- item2
... #文件结束
--- #新文件开始
key: value1
numberKey: 321
array:
- item3
- item4
... #文件结束
数据合并与参考
结点参考符号(*)
键值对合并符号(«)
参考到其它结点标签的锚点标记符号(&)
参考可用于所有数据结构,而合并仅可用于键值对
---
- good: &id01 #定义锚点
name: Coke cola
vol: 330ml
price: 2.5
- good:
<<: *id01 #合并,使用在锚点定义的内容
vol: 600ml #重写vol键值
price: 3 #重写price键值
- good:
<<: *id01 #合并,使用在锚点定义的内容
name: Sprite #重写name键值
flavor: > #添加新的键值对
shit flavor
nobody likes
类型转换
a: 123 #整型
b: "123" #字符串
c: 123.0 #float型
d: !!float 123 #指定float
e: !!str 123 #指定string
f: !!str true #指定string
g: true #bool型
h: Yes #bool型
i: Yes we have No bananas #字符串
特殊形态
除了一般的数据形态之外,用户也可以使用一些较为高级的类型,但不保证可被每种解析器分析。使用时和强制转型类似,要在形态名称之前加上两个感叹号(!!)。有几种重要的形态在本篇没有讨论,包括集合(sets),有序映照(ordered maps),时间戳记(timestamps)以及十六进制数据(hexadecimal)。下面这个示例则是比特数据(binary)
---
picture: !!binary |
R0lGODlhDAAMAIQAAP//9/X
17unp5WZmZgAAAOfn515eXv
Pz7Y6OjuDg4J+fn5OTk6enp
56enmleECcgggoBADs=mZmE
许多YAML的实现允许用户自定义数据形态。在将一个对象序列化时,这个方法还颇方便的。某些区域数据形态可能不存在默认的数据形态中,不过这种类型在特定的YAML应用程序中是有定义的。这种区域数据形态用感叹号(!)表示。
---
myObject: !MyClass {name: Jobs, age: 64}
在Unity中使用YAML
本篇中使用.net开源库YamlDotNet解析YAML文件,如需查看原文请点击上文链接或者这里跳转。
导入YAML动态库
在Unity中使用动态链接库需要先将DLL文件放入dataPath\Assets\Plugins
文件夹下,然后在代码中导入YAML命名空间。
值得注意的是,该开源库同样提供了Unity资源,在Asset Store搜索YamlDotNet便可以方便直接将代码导入项目。
using YamlDotNet;
序列化
var serializer = new SerializerBuilder().Build();
string yaml = serializer.Serialize(obj);
反序列化
string yaml = File.ReadAllText("text.yaml");
var deserializer = new Deserializer();
MyObject obj = deserializer.Deserialize<MyObject>(yaml);
值得注意的是YamlDotNet仅支持对属性的访问,故在反序列化时对于的对象中应包含相对应的属性。
更多YamlDotNet用法请查阅YamlDotNet Wiki。