C#使用YAML基础语法和心得

引言

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

天涯遍地是小草

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值