首页 > 其他分享 >梭梭带你彻底搞懂YAML序列化语言

梭梭带你彻底搞懂YAML序列化语言

时间:2023-12-22 12:33:22浏览次数:59  
标签:00 空格 YAML JSON value2 value1 搞懂 序列化

目录

前言

YAML 并不是一种新奇的语言,YAML 首次发表于 2001 年,距离现在已经过去差不多 20 个年头。YAML 虽然不如 JSON、XML 之类的语言流行,应用也没有那么广泛,但是 YAML 也有它的优势。


简介

YAML 是一种较为人性化的数据序列化语言,可以配合目前大多数编程语言使用。

YAML 的语法比较简洁直观,特点是使用空格来表达层次结构,其最大优势在于数据结构方面的表达,所以 YAML 更多应用于编写配置文件,其文件一般以 .yml 为后缀。

YAML 目前的官方全称为 “YAML Ain't Markup Language(YAML 不是标记语言)”,但有意思的是,其实 YAML 最初的含义是 “Yet Another Markup Language(还是一种标记语言)”。
目前 YAML 的最新版本为 1.2(第三个版本),本文将以 YAML 1.2 的标准进行讲解。

一般来说,最常用的使用.yml 作为 Yaml 文件后缀名;

yaml基本语法规则

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进时不允许使用Tab键,只允许使用空格。
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  • #表示注释,从这个字符一直到行尾,都会被解析器忽略,这个和python的注释一样

yaml支持的数据结构有三种

  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  • 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
  • 纯量(scalars):单个的、不可再分的值。例如:
  1. 字符串:字符串一般默认不加双引号,当字符串包含了空格或者特殊字符等,可需要使用双引号
  2. 布尔值:true、True、false、False都可以
  3. 整数:如1、2、3,如用逗号或者空格分割,则会变成字符串传入
  4. 浮点数:如2.0
  5. null:~ null和~都可以表示None
  6. 日期:如2023-03-20 格式:yyy-MM-dd
  7. 时间:如2023-03-20T20:20:20 格式:yyy-MM-dd HH:mm:ss,日期和时间可用T分割,也可用空格分割

基本语法

大小写敏感

  • 就是字面上的意思
hr:  65    # Home runs
avg: 0.278 # Batting average
rbi: 147   # Runs Batted In

用缩进表示层级关系

  • 缩进只能使用空格,不能用 TAB 字符
  • 缩进的空格数量不重要,但是同一层级的元素左侧必须对齐
# YAML
one:          # 第一个参数名称必须需要打头写
  two: 2
  three:
    four: 4
    five: 5

// 以上的内容转成 JSON 后
"one": {
  "two": 2,
  "three": {
    "four": 4,
    "five": 5 
  }
}

用 # 表示注释

  • 只支持单行注释
# 我是注释
# 我也是注释

一个文件中可以包含多个文件的内容

  • 用“ --- ”即三个破折号表示一份内容的开始
  • 用“ ... ”即三个小数点表示一份内容的结束(非必需)
---
# 这是第一份内容
one: 1
# 其他内容...
...

---
# 这是第二份内容
two: 2
# 其他内容...

数据结构与类型

# yaml对格式有严格的要求每个冒号后都要有一个空格,第一个参数名称必须需要打头写;

对象(Mapping)

表示以键值对(key: value)形式出现的数据

  • 使用“冒号+空格”来分开
# YAML
key: value

// JSON
"key": "value"
  • 支持多层嵌套(用缩进表示层级关系
# YAML
key:
  child-key1: value1
  child-key2: value2

// JSON
"key": {
  "child-key1": "value1",
  "child-key2": "value2",
}
  • 支持流式风格( Flow style)的语法(用花括号包裹,用逗号加空格分隔,类似 JSON)
# YAML
key: { child-key1: value1, child-key2: value2 }

// JSON
"key": { "child-key1": "value1", "child-key2": "value2" }
  • 使用问号“?”声明一个复杂对象,允许你使用多个词汇(数组)来组成键
# YAML
?
  - keypart1
  - keypart2
:
  - value1
  - value2

数组(Sequence)

  • 一组以区块格式(Block Format)(即“破折号+空格”)开头的数据组成一个数组
# YAML
values:
  - value1
  - value2
  - value3

// JSON
"values": [ "value1", "value2", "value3" ]
  • 同时也支持内联格式(Inline Format)来表达(用方括号包裹,逗号加空格分隔,类似 JSON)
# YAML
values: [value1, value2, value3]

// JSON
"values": [ "value1", "value2", "value3" ]
  • 支持多维数组(用缩进表示层级关系
# YAML
values:
  -
    - value1
    - value2
  -
    - value3
    - value4

// JSON
"values": [ [ "value1", "value2"], ["value3", "value4"] ]

标量(Scalars)

表示 YAML 中最基本的数据类型

字符串(String)

  • 字符串一般不需要用引号包裹,但是如果字符串中使用了反斜杠“\”开头的转义字符就必须使用引号包裹
# YAML
strings:
  - Hello without quote # 不用引号包裹
  - Hello
   world # 拆成多行后会自动在中间添加空格
  - 'Hello with single quotes' # 单引号包裹
  - "Hello with double quotes" # 双引号包裹
  - "I am fine. \u263A" # 使用双引号包裹时支持 Unicode 编码
  - "\x0d\x0a is \r\n" # 使用双引号包裹时还支持 Hex 编码
  - 'He said: "Hello!"' # 单双引号支持嵌套"

// JSON
"strings":
  [ "Hello without quote",
    "Hello world",
    "Hello with single quotes",
    "Hello with double quotes",
    "I am fine. ☺",
    "\r\n is \r\n",
    "He said: 'Hello!'" ]
  • 对于多行的文字,YAML 提供了两种特殊的语法支持

保留换行(Newlines preserved)

使用竖线符“ | ”来表示该语法,每行的缩进和行尾空白都会被去掉,而额外的缩进会被保留

# YAML
lines: |
  我是第一行
  我是第二行
    我是吴彦祖
      我是第四行
  我是第五行

// JSON
"lines": "我是第一行\n我是第二行\n  我是吴彦祖\n     我是第四行\n我是第五行"

折叠换行(Newlines folded)

使用右尖括号“ > ”来表示该语法,只有空白行才会被识别为换行,原来的换行符都会被转换成空格

# YAML
lines: >
  我是第一行
  我也是第一行
  我仍是第一行
  我依旧是第一行

  我是第二行
  这么巧我也是第二行

// JSON
"lines": "我是第一行 我也是第一行 我仍是第一行 我依旧是第一行\n我是第二行 这么巧我也是第二行"

布尔值(Boolean)

  • “true”、“True”、“TRUE”、“yes”、“Yes”和“YES”皆为
  • “false”、“False”、“FALSE”、“no”、“No”和“NO”皆为
# YAML
boolean:
  - true # True、TRUE
  - yes # Yes、YES
  - false # False、FALSE
  - no # No、NO

// JSON
"boolean": [ true, true, false, false ]

整数(Integer)

  • 支持二进制表示
# YAML
int:
  - 666
  - 0001_0000 # 二进制表示

// JSON
"int": [ 666, 4096 ]

浮点数(Floating Point)

  • 支持科学计数法
# YAML
float:
  - 3.14
  - 6.8523015e+5 # 使用科学计数法

// JSON
"float": [ 3.14, 685230.15 ]

空(Null)

  • “null”、“Null”和“~”都是空,不指定值默认也是空
# YAML
nulls:
  - null
  - Null
  - ~
  -

// JSON
"nulls": [ null, null, null, null ]

时间戳(Timestamp)

  • YAML 也支持 ISO 8601 格式的时间数据

这里使用 JavaScript 对象进行对比

# YAML
date1: 2020-05-26
date2: 2020-05-26T01:00:00+08:00
dete3: 2020-05-26T02:00:00.10+08:00
date4: 2020-05-26 03:00:00.10 +8

// JavaScript
date1: Tue May 26 2020 08:00:00 GMT+0800 (中国标准时间),
date2: Tue May 26 2020 01:00:00 GMT+0800 (中国标准时间),
dete3: Tue May 26 2020 02:00:00 GMT+0800 (中国标准时间),
date4: Tue May 26 2020 03:00:00 GMT+0800 (中国标准时间)

类型转换

  • YAML 支持使用严格类型标签“!!”(双感叹号+目标类型)来强制转换类型
# YAML
a: !!float '666' # !! 为严格类型标签
b: '666' # 其实双引号也算是类型转换符
c: !!str 666 # 整数转为字符串
d: !!str 666.66 # 浮点数转为字符串
e: !!str true # 布尔值转为字符串
f: !!str yes # 布尔值转为字符串

// JSON
"a": 666,
"b": "666",
"c": "666",
"d": "666.66",
"e": "true"
"f": "yes"

其他高级类型

YAML 也可以使用一些更高级的类型,但是并不一定兼容所有解析器,包括:
	1. 集合(Sets)
	2. 有序映射(Ordered Map)
	3. 十六进制数据(Hexdecimal)
	4. 二进制数据(Binary)。

# 本文将不会对这几种类型进行讲解,感兴趣的读者可以自行搜索研究。

数据重用与合并

  • 为了保持内容的简洁,避免过多重复的定义,YAML 提供了由锚点标签“&”引用标签“*”组成的语法,利用这套语法可以快速引用相同的一些数据...
# YAML
a: &anchor # 设置锚点
  one: 1
  two: 2
  three: 3
b: *anchor # 引用锚点

// JSON
"a": {
  "one": 1,
  "two": 2,
  "three": 3
},
"b": {
  "one": 1,
  "two": 2,
  "three": 3
}
  • 配合合并标签“<<”使用可以与任意数据进行合并,你可以把这套操作想象成面向对象语言中的继承...
# YAML
human: &base # 添加名为 base 的锚点
    body: 1
    hair: 999
singer:
    <<: *base # 引用 base 锚点,实例化时会自动展开
    skill: sing # 添加额外的属性
programer:
    <<: *base # 引用 base 锚点,实例化时会自动展开
    hair: 6 # 覆写 base 中的属性
    skill: code # 添加额外的属性

// JSON
"human": { "body": 1, "hair": 999 },
"singer": { "body": 1, "hair": 999, "skill": "sing" },
"programer": { "body": 1, "hair": 6, "skill": "code" }

ISSUE

...

总结

	YAML是一种功能强大的语言,可用于配置文件、应用程序之间的消息和保存应用程序状态。我们介绍了它最常用的特性,包括如何使用内置数据类型和构造复杂文档。它还支持自定义函数、正则表达式这样的高级功能

参考网址

标签:00,空格,YAML,JSON,value2,value1,搞懂,序列化
From: https://www.cnblogs.com/shiwei1930/p/17921347.html

相关文章

  • dfr之序列化常用字段、soruce、定制返回字段、多表关联反序列化、ModelSerializer的使
    一、序列化类常用字段#除了CharField以外,还要很多别的---》表模型中models.CharField--->基本一一对应#如果跟表模型中对不上:你统一用CharField#重要:(后面说)ListFieldDictField字段字段构造方式BooleanFieldBooleanField()NullBooleanFieldNullB......
  • java读取yaml文件
    应用场景自动化测试中,用例数据存放在yaml文件中 数据 person.yaml---id:1name:韧age:18---id:2name:qzcsbjage:19person2.yaml----id:3name:小韧age:18-id:4name:全栈测试笔记age:19person3.yaml----id:5......
  • Jackson给给指定类设置序列化规则
    背景业务中需要对返回给APP端的数据进行特殊处理,包括:null值转换成空字符串日期(LocalDateTime)类型转换成时间戳金额根据用户Locale做格式化需要保证不影响内部其他服务的互相调用,因此让所有返回给APP的VO对象实现自定义的Vo接口,然后指定对Vo接口的类进行对应的转换。实现co......
  • Fastjson2基础使用以及底层序列化/反序列化实现探究
    来自于:https://www.cnblogs.com/6b7b5fc3/p/17134421.html1Fastjson2简介Fastjson2是Fastjson的升级版,特征:协议支持:支持JSON/JSONB两种协议部分解析:可以使用JSONPath进行部分解析获取需要的值语言支持:Java/Kotlin场景支持:Android8+/服务端其他特性支持:GraalNative-Image......
  • Spring Boot原理分析 | SpringApplication、Yaml、Properties
    ......
  • drf之序列化类
    序列化类介绍1序列化qs对象,单个对象做序列化给前端2反序列化数据校验:前端传入数据---》校验数据是否合法3反序列化---》前端传入数据,存到数据库中#因为咱么在写接口时,需要序列化,需要反序列化,而且反序列化的过程中要做数据校验---》drf直接提供了固定的写法,只要按照固......
  • Externalizable接口实现序列化与反序列化
    Externalizable接口实现序列化与反序列化packagecom.example.core.mydemo.java;importcom.example.core.mydemo.json2.GsonUtils;importjava.io.*;/***Externalizable接口实现序列化与反序列化**Serialization(序列化):将java对象以一连串的字节保存在磁盘文件......
  • Java序列化和反序列化 Serializable BeanUtils.copyProperties赋值属性方法
    Java序列化和反序列化SerializableBeanUtils.copyProperties赋值属性方法packagecom.example.core.mydemo.java;importcom.example.core.mydemo.json2.GsonUtils;importorg.springframework.beans.BeanUtils;importjava.io.*;/***Java序列化和反序列化Serializ......
  • 【代码块】-结构体序列化与反序列化
    整理代码块代码块整理后存储,供后期使用结构体序列化与反序列化usingSystem;usingSystem.Runtime.InteropServices;usingSystem.Text;namespacestructTest{///<summary>///结构体序列化///</summary>publicclassstructSerializable{......
  • c# - 如何在自定义 System.Text.Json JsonConverter 中使用默认序列化?
    我正在写一个 custom System.Text.Json.JsonConverter 将旧数据模型升级到新版本。我已覆盖 Read()并实现了必要的后处理。但是,我根本不需要在 Write() 中做任何自定义操作。方法。如果我根本没有转换器,如何自动生成默认序列化?显然我可以使用不同的 JsonSerializerOption......