引言
YAML所表示的YAML Ain’t Markup Language,YAML 是一种简洁的非标记语言。YAML以数据为中心,使用空白,缩进,分行组织数据,从而使得表示更加简洁易读。
一个YAML转化JSON网页,链接
C#需要使用一些库来方便快捷的读写yaml文件,官方链接上给了这些信息:
C#/.NET:
- YamlDotNet # YAML 1.1 library with serialization support
- yaml-net # YAML 1.1 library
- yatools.net # (in-progress) YAML 1.1 implementation
因此本文测试是基于:vs2015+YamlDotNet 4.3.1.0
用nuget下载的YamlDotNet
基本规则一致,但是库不同可能细节略有差别
一、书写
1.1 基本规则
YAML有以下基本规则:
1、大小写敏感
2、使用缩进表示层级关系
3、禁止使用tab缩进,只能使用空格键
4、缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级。
5、使用#表示注释
6、字符串可以不用引号标注
1.2 三种数据结构
1、map,散列表
使用冒号(:)表示键值对,同一缩进的所有键值对属于一个map,示例:
# YAML表示
age : 12
name : huang
# 对应的Json表示
{'age':12,'name':'huang'}
也可以将一个map写在一行:
# YAML表示
{age:12,name:huang}
# 对应的Json表示
{'age':12,'name':'huang'}
2、list,数组
使用连字符(-)表示:
# YAML表示
- a
- b
- 12
# 对应Json表示
['a','b',12]
也可以写在一行:
# YAML表示
[a,b,c]
# 对应Json表示
[ 'a', 'b', 'c' ]
1.2 使用心得
使用示例可以参考https://mp.csdn.net/mdeditor/80262772
- 1、yaml文件变量类型为[Key: Value],注意冒号后面有一个空格
- 2、冒号后值为空的时候,为默认值,注意使用英文的冒号
- 3、如果参数是以空格开始或结束的字符串,应使用单引号把他包进来。如果一个字符串参数包含特殊字符,也要用单引号包起来。下面是示例:
如果要保存类似 http://www.bai‘u.com这样的数据时,下面这种写法是错误的:
website:{ baidu: http://www.bai‘u.com }#写法错误,因为没有用单引号括起来;
website:{ baidu: ’ http://www.bai”u.com’}#写法正确,如果字符串中本身包含单引号,则需要用‘’进行转义;如果字符串开头或结尾包含空格,则需要用单引号将整个字符串包裹
在书写键值对时,如果键名或键值包含非英文字母和数字,应该用引号括起来,例如: ‘标题’: ‘这是我的第一本杂志’ - 4、如果yaml里没有该项:
string值为null
int值为0
List< T >长度为0
List中的string为null,对于[,”b”]这样的数组,要用yaml的“-”形式,不能用[]形式
bool值为false
需要从配置文件反序列化的类,类中可以有不参与反序列化/序列化的枚举类型,但成员变量不能是枚举类型。如果成员变量是枚举类型,在序列化时候会直接忽略,在反序列化时候由于不能赋值会报异常。
int[]数组类型不能用,只测试出序列化和反序列化为list - 5、如果yaml文件中有,而配置类中没有,则会提示异常
- 6、yaml文件中变量顺序可以和类中不一致,但变量名应该一致(包括大小写)
- 7、string的值可以为中文字符串,注意使用英文的引号
- 8、yaml文件无自己的数据类型,载入时使用的是对应语言中定义的数据类型
- 10、C#文件中需要使用属性进行赋值操作,否则会引发异常
二、调试
C#类是
public class TestYaml
{
public class PcClass
{
private string ipv4;
private int port;
public string Ipv4
{
get { return ipv4; }
set { ipv4 = value; }
}
public int Port
{
get{return port;}
set{port = value;}
}
}
private List<PcClass> Info = new List<PcClass>();
public List<PcClass> Info
{
get
{
return Info;
}
set
{
Info = value;
}
}
}
比如有如下yaml文件,正确的:
Info:
- Ipv4: "192.168.1.111"
Port: 8241
错误示例1:
Info:
- Ipv4: "192.168.1.111"
Portxxxxxx: 8241
其中第3行的Port多打了一堆x,则错误提示line2表示从第2行开始的[Ipv4,Port]数组错误,2是数组开始的横杆那行的行号。
错误示例2:
Info:
- Ipv4: "192.168.1.111"
Port: abcdxxxxxx
其中第3行的Port不应该是字符串类型,则错误提示line3表示从第3行开始的Port(标量scalar类型)错误,3是标量开始那行的行号。
参考资料:
1、官方链接:http://yaml.org/
2、YAML最最基础语法:https://blog.csdn.net/vincent_hbl/article/details/75411243