YAML第一章 基本概念及语法

24 篇文章 1 订阅
4 篇文章 0 订阅

YAML第一章 基本概念及语法

简介

本文对YAML的基本概念及语法进行了详细的分析,尤其是对YAML的语法进行了详细的阐述,旨在希望通过本文能对YAML有一个基本的了解,能够书写YAML文档。

声明

本文中的内容属于个人总结整理而来,个人水平有限,对于部分细节难免有理解错误及遗漏之处,如果您在阅读过程中有所发现,希望您能指正,同时文章中的部分内容也参考了其它大神的文章,如果文章中的内容侵犯了您的权益,表示非常歉意,请您指出,我将尽快修改。

如果您进行转载,请标明出处。

YAML学习笔记一 YAML基本概念及语法(http://www.liyubin.com/articles/2019/03/14/1552529532355.html)

YAML基本概念

1. YAML简介

YAML,是一个可读性高,用来表达资料序列的编程语言。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式。目YAML是”YAML Ain’t a Markup Language”(YAML不是一种置标语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:”Yet Another Markup Language”(仍是一种置标语言),但为了强调这种语言以数据做为中心,而不是以置标语言为重点,而用返璞词重新命名。

YAML官方文档中给的定义很简单,即:“YAML Ain’t Markup Language” (abbreviated YAML) is a data serialization language designed to be human-friendly and work well with modern programming languages for common everyday tasks. This specification is both an introduction to the YAML language and the concepts supporting it; it is also a complete reference of the information needed to develop applications for processing YAML.

2. YAML VS XML,YAML VS Json,…

网上有很多关于这类的文章的描述,不过多介绍,有兴趣的可以自行搜索比较,看看各路大神对YAML的分析

3. YAML不足

YAML没有自己的数据类型的定义,而是使用实现语言的数据类型。一个YAML文件,在不同语言中解析后得到的数据类型可能会不同,由于其兼容性问题,不同语言间的数据流转不建议使用YAML。

YAML基本语法

1. YAML语法

  • 基本格式要求

    • YAML使用可打印的Unicode编码作为标准字符编码,可以使用UTF-8或者UTF-16
    • YAML对于大小写是敏感的
    • YAML文件使用.yaml做为后缀
    • YAML使用缩进代表层级关系,同时缩进只能使用空格,不能使用tab键(推荐:在各种语言中为了使用代码统一,可以在各编辑器中设置使用空格来替换Tab,一般使用4个空格),对于空格的数量没有特别的要求,但相同的层级在左对齐
  • 基本类型

    • 内置类型

      类型表示方法备注
      整数!!int可使用10进制,2进制,8进制,16进制表示
      浮点数!!float
      布尔!!bool可以是True,true,tRue,False等,忽略大小写
      字符串!!str复杂的情况下可以文本块
      二进制!!binary也是字符串类型
      日期时间!!timestamp采用ISO8601格式
      空值!!
      集合!!set
      序列!!seq----
      键值表!!map键是唯一的
      键值列表!!omap
      对象列表!!pairs

      特别指出:对于二进制类型来说本质是上一个base64的文本块,如:

      picture: !!binary |
       R0lGODlhDAAMAIQAAP//9/X
       17unp5WZmZgAAAOfn515eXv
       Pz7Y6OjuDg4J+fn5OTk6enp
       56enmleECcgggoBADs=
      
    • 常量值

      表示单个的,不可再分的值,主要的结构有:整数,浮点数,字符串,NULL,日期,布尔,时间

      布尔型类型:

      值为true/false,完全忽略大小写
      isstudent: trUe
      

      浮点数:

      固定小数:
      pi: 3.1415926
      
      科学计数法表示:
      pi: 31415926e-8
      
      负无穷:
      minmin: -.inf
      
      无效数字:
      notnum: .NaN
      

      整型值:可以使用10进制、2进制、8进制、16进制表示

      10进制:
      intvalue: 123
      
      2进制:
      intvalue: 0b1010_1010
      
      8进制:
      intvalue: 0o34
      
      16进制:
      intvalue: 0xFFFF
      

      字符串/文本块:

      strvalue: newline
      
      字符串类的值,也可以使用单引号或双引号,若字符串中包含有空格或者特殊字符,则必须使用单引号或者双引号,双引号与单引号还有不同,双引号不会对特殊字符转义,若单引号之中还有单引号,则必须连续使用两个单引号转义
      字符串可以拆成多行,每一行会被转成一个空格,对于多行字符串可以使用|保留换行符,也可以使用>折叠换行,使用+表示保留文字块末尾的换行,使用-表示删除字符串末尾的换行
      字符串也可以HTML标记
      
      strvalue: 'new\nline'
      使用单引号相当于{ strvalue: 'new\\nline' }
      
      strvalue: "new\nline"
      使用双引号相当于{ strvalue: 'new\nline' },双引号不会对特殊字符转义
      
      strvalue: new
                line
      字符串可以拆成多行,每一行会被转成一个空格,相当于{ strvalue: 'new line' }
      
      strvalue: |
        new
        line
      使用|来表示需要保留换行符,相当于{ strvalue: 'new\nline\n' }
      
      strvalue: >
        new
        line
      使用>折叠换行,相当于{ strvalue: 'new line\n' }
      
      strvalue: |+
        new
        line
      使用+表示保留末尾的换行,相当于{ strvalue: 'new\nline\n' }
      
      strvalue: |-
        new
        line
      使用-表示删除末尾的换行,相当于{ strvalue: 'new\nline' }
      
      strvalue: |
        <p style="color: red">
          newline
        </p>
      相当于{ strvalue: '<p style="color: red">\n  newline\n</p>\n' }
      

      日期类型:

      日期必须使用ISO 8601格式,即:yyyy-MM-dd
      date: 2019-03-13
      

      时间类型:

      时间使用ISO 8601格式,时间和日期之间使用T连接,使用+或者-代表时区
      datetime: 2019-03-13T20:49:33+08:00
      

      NULL类型:

      使用~表示null
      nullvalue: ~
      
      相当于{ nullvalue: null }
      
    • 键值表、映射、哈希、字典

      键值对的集合,使用冒号(: )代表,格式为key: value,需要注意的是冒号后面需要添加一个空格,如:

      Block style: !!map
        Clark : Evans
        Brian : Ingerson
        Oren  : Ben-Kiki
      Flow style: !!map { Clark: Evans, Brian: Ingerson, Oren: Ben-Kiki }
      
      相当于
      
      { 'Block style': { Clark: 'Evans', Brian: 'Ingerson', Oren: 'Ben-Kiki' },'Flow style': { Clark: 'Evans', Brian: 'Ingerson', Oren: 'Ben-Kiki' } }
      
      

      当键是一个列表或者键值表时,需要使用问号(? )表示复杂的键,如:

      ? - blue
        - red
        - green
      : Color
      
      也可以使用流式表示
      ? [blue, reg, green]: Color
      
      相当于:
      
      { 'blue,red,green': 'Color' }
      
      
      
    • 数组、序列、列表

      一组按次序排列的值,使用短横线(- )代表数组,格式为- value,需要注意的短横线后面需要添加一个空格,如:

      student:
        - jone
        - steven
        - bob
      

      数组可以使用复杂的类型,比如:

      classes:
        - 
          id: 1001
          name: jone
          age: 12
        - 
          id: 1002
          name: steven
          age: 14
        -
          id: 1003
          name: bob
          age: 15
      

      数组中复杂的类型,也可以使用流式(flow)方式表示,如:

      classes: [{id: 1001, name: jone, age: 12},{id: 1002, name: steven, age: 14},{id: 1003, name: bob,age: 15}]
      
  • 注释

    YAML中使得#做为注释,从这个字符一直到行尾,都会被忽略

  • 文档开始与结束符

    使用三个短横线(—),表示一个文档的开始,一般情况下在同一个文件中有有多个时使用
    使用三个点号(…),表示一个文档的结束,一般情况下和—共同使用。尤其是对于网络传输或者流来说,作为明确的结束符号有利于软件的处理。

    比如:
    ```
    
    ---
    id: 1001
    name: jone
    age: 12
    ...
    ---
    id: 1002
    name: steven
    age: 14
    ...
    
    ```
    
  • 类型强制转换

    可以使用双感叹号(!!),表示需要进行类型转换,如:

    使用!!str将整型及bool型强制转成字符串
    
    string:
      - !!str 123456
      - !!str true
    
    

    具体的内置类型可以参看上述的类型描述中

  • 引用

    可以使用&符号来定义描点,可以使用*来引用定义的描点,可以使用<<来合并到当前数据中,如:

    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
    
    
  • 指令符号

    在单一的文档中可以使用指导指令,一般情况下定义在文档的开始早于开始符号(—),使用百分比符号(%),在YAML1.1中定义了两个指导指令:

    • %YAML 指导指令,用来识别文件的YAML版本号,放在文档的首行
    • %TAG 指导指令,被用在URI的字首标记,这个方法在标记节点的型态时相当有用

    TODO:有待进一步补充

  • 自定义类型或标识

    可以使用单个感叹号(!)表示自定义类型

    TODO:有待进一步补充

2. YAML各种语言的实现

YAML语言已经有了多种语言的实现,具体的参见YAML官网,此处将会重点介绍一下C#中YAML的实现。

章节

参考资料

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值