序列化 配置 json json5 yaml
目录
配置及序列化语言
JSON
- JSON:JavaScript Object Notation(JavaScript 对象表示法)
- JSON 文件的文件类型是
.json
,文本的 MIME 类型是application/json
- JSON 是存储和交换文本信息的语法,比 XML 更小、更快,更易解析
- JSON 的常规用途是同 web 服务器进行数据传输
简介
JSON 是一种轻量级的 数据交换格式。它基于 ECMAScript
的一个子集,采用完全独立于编程语言的文本格式
来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。具有自我描述性,易于人阅读和编写,同时也易于机器解析和生成。
JSON 是 JavaScript 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。
var obj = {a: 'Hello', b: 'World'}; //这是一个 JS 对象
var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串
var obj2 = JSON.parse(json); //从 JSON 字符串转换为 JS 对象
var json2 = JSON.stringify(obj); //从 JS 对象转换为 JSON 字符串
语法规则
- JSON 是由
六个构造字符、字符串、数字、三个字面值
组成的一个标记符序列- 六个构造字符:
[]{}:,
- 三个字面值:
true
、false
、null
,必须使用小写的英文
- 六个构造字符:
- 六个构造字符前后允许存在任意个无意义的空白符:
空格
、\t
、\n
、\r
- 值可以是
对象、数组、数字、字符串、三个字面值
中的一个 - 字符串是由
双引号
包围的任意数量 Unicode 字符的集合,使用反斜线转义
注意:JSON 对象中的 key/value
是无序的
- JSON 的规范标准只定义了数据格式,没有限制解析器的任何操作
- 大多数解析器解析后是用由 Map 存储 KV 的,所以内容存放的顺序并不是有序的
和 XML 的比较
相同之处:
- 具有自我描述性:人类可读
- 具有层级结构:使用结构化方法来标记数据
- 具有可扩展性:都需要预先知道数据结构才可以解析
- 使用广泛:都能被大量编程语言解析和使用
相比 XML 的优势:
- 有效数据率更高:没有结束标签,数据量大幅减少
- 更简洁、更易读:更简单的语法格式,更清晰的层次结构
- 读写的速度更快
- 使用数组
- 不使用保留字
JSON5
JSON5:JSON for Humans 更人性化的 JSON
JSON5 是对 JSON 的扩展,让人可以更容易手工编写和维护。因为 JSON5 不是 JSON 官方的扩展,所以需要 .json5
作为文件扩展名。
解决的痛点
- 不支持注释
- 末尾不能有多余的逗号
- 不支持字符串换行
- 所有的 key 都必须加双引号
语法
- 对象的 key 允许没有双引号
- 对象的 key 可以是任何 ES5.1 的标识符
- 对象和数组允许有多余的逗号结尾
- 字符串允许使用双引号、单引号包裹
- 字符串可以多行
- 字符串允许使用转义字符:
"Hello\nWorld\n!"
- 数字可以用十六进制表示:
0xFF
- 数字允许使用小数点开头或结尾:
.007
,7.
- 数字前面可以有正号
+
或负号-
- 数字可以使用正无穷大
Infinity
、负无穷大-Infinity
、和Nan
来表示 - 支持单行注释
//
和多行注释/* */
- 允许在任何在 json5 相关符号前后出现多余的空白符
支持的空白符
U+0009: Horizontal tab
U+000A: Line feed
U+000B: Vertical tab
U+000C: Form feed
U+000D: Carriage return
U+0020: Space
U+00A0: Non-breaking space
U+2028: Line separator
U+2029: Paragraph separator
U+FEFF: Byte order mark
Unicode Zs category: Any other character in the Space Separator Unicode category
YAML
YAML is a human-friendly data serialization language for all programming languages.
YAML 最初的含义是:Yet Another Markup Language
但目前官方的全称是:YAML Ain't Markup Language,傻逼程度可以见一斑
简介
YAML 首次发表于 2001 年,虽然不如 JSON、XML 之类的语言流行,应用也没有那么广泛,但是 YAML 也有它的优势。
YAML 的语法比较简洁直观,特点是使用空格
来表达层次结构,其最大优势在于数据结构方面的表达,所以 YAML 更多应用于编写配置文件,其文件一般以 .yml
为后缀。
基本语法规则
- 大小写敏感
- 字符串一般不需要用引号包裹(字符串语法是最复杂的)
- 使用
缩进
表示层级关系- 缩进时不允许使用
Tab
键,只允许使用空格
- 缩进的
空格数目
不重要,但要求相同层级的元素左侧对齐
(左侧空格个数相同)
- 缩进时不允许使用
- 用
#
表示注释,只支持单行注释
三种数据结构
- 对象:键值对的集合,又称为映射 mapping、哈希 hashes、字典 dictionary
- 使用
冒号+空格
(冒号后至少要有一个空格或换行)来分开键与值 - 支持多层嵌套,用缩进表示层级关系
- 支持流式风格的语法:用
花括号{}
包裹、用逗号
分隔(前后均对空格没要求),类似 JSON - 较为复杂的对象,可以使用
问号+空格
代表一个 key,配合使用冒号+空格
代表一个 value
- 使用
- 数组:一组按
次序
排列的值,又称为序列 sequence、列表 list- 使用
冒号+空格
(冒号后至少要有一个空格或换行)来分开键与值 - 支持多维数组,用缩进表示层级关系
- 支持内联格式的语法:用
方括号[]
包裹、用逗号
分隔(前后均对空格没要求),类似 JSON
- 使用
- 纯量:又称 标量 scalars,单个的、不可再分的值
key1:
child-key1: value1
child-key2: value2
key2: { child-key1: value1, child-key2: value2 } # 流式风格
values1:
- value1 # 最左边的空格缩进是非必须的
- value2
values2: [value1, value2] # 内联格式
values3:
-
- value1
- value2
-
- value3
- value4
纯量
- 字符串:一般不需要用
引号
包裹 - 布尔值:
true
、True、TRUE、yes、Yes、YES 为真,false
、False、FALSE、no、No、NO 为假 - 整数:
666
、0001_0000
、0b1010
(二进制表示) - 浮点数:
3.14
、6.8523015e+5
(科学计数法) - 空:
null
、Null
、~
,不指定值默认也是空 - 日期:日期必须使用 ISO 8601 格式,即
yyyy-MM-dd
- 时间:使用 ISO 8601 格式的时间数据,时间和日期之间使用
T
连接,最后使用+
代表时区
date1: 2018-02-17
time1: 2020-05-26
time2: 2020-05-26T01:00:00+08:00
time3: 2020-05-26T02:00:00.10+08:00
time4: 2020-05-26 03:00:00.10 +8
YAML 允许使用两个感叹号
强制转换数据类型
values:
- !!str 666 # 强制转换为字符串
- !!str true # 强制转换为字符串
- '666' # 双引号也算是类型转换符
- !!float '666' # 强制转换为浮点数
字符串
字符串一般不需要用引号
包裹
strings:
- without quote # 【without quote】字符串默认不使用引号包裹
- 'single quotes' # 如果包含空格或特殊字符,需要放在引号之中
- "double quotes" # 可以使用单引号,也可以使用双引号
- '"Hello!"' # 【\"Hello!\"】单双引号内可嵌套双引号
- 'I''m sorry' # 【I'm sorry】单引号中的单引号,需要使用两个单引号转义
- "a\na" # 【a\na】双引号不会对特殊字符转义
- 'a\na' # 【a\\na】单引号会对特殊字符转义
- "smile \u263A" # 【smile ☺】双引号支持 Unicode 编码
- "\x0d\x0a" # 【\r\n】双引号支持 Hex 编码
多行文字三两种表示方式
lines1: 这是一段
多行
字符串 # 【这是一段 多行 字符串】只有最后一行允许使用注释
# 字符串可以写成多行,换行符会被转为空格;从第二行开始,必须有一个单空格缩进
lines2: |- # 【保留换行】,每行的缩进和行尾空白都会被去掉,额外的缩进会被保留
我是第一行
我是第二行
我是第三行
我是第四行
我是第五行
# 【我是第一行\n我是第二行\n 我是第三行\n 我是第四行\n我是第五行】只有第一行允许使用注释
lines3: >- # 【折叠换行】,换行符会被转换成空格,只有空白行才会被识别为换行
我是第一行
我也是第一行
我是第二行
我也是第二行
# 【我是第一行 我也是第一行\n我是第二行 我也是第二行】只有第一行允许使用注释
|+
或>+
表示保留文字块末尾的换行,|-
或>-
表示删除字符串末尾的换行
引用
为了保持内容的简洁,避免过多重复的定义,YAML 提供了由锚点标签&
、引用标签*
、合并标签<<
组成的语法,利用这套语法可以快速引用
相同的一些数据,或与任意数据进行合并
。
a: &bqt # 定义锚点【bqt】
name: baiqiantao
age: 30
b: *bqt # 引用锚点【bqt】,不能添加额外的信息
c:
<<: *bqt # 合并锚点【bqt】到当前数据
name: boy # 覆写锚点中的属性
skill: code # 添加额外的属性
YAML vs JSON
- YAML is best suited for
configuration
where JSON is better as aserialization
format or serving up data for your APIs. - JSON is best suited as a
serialization
format. It is much moreexplicit and strict
更加明确和严格 than YAML. It is a very popular format for transmitting data over http. - YAML is a superset 超集 of JSON, which means you can parse JSON with a YAML parser.
YAML has a different feature set than JSON, including but not limited to:
- the ability to self reference 自我参考
- support for complex datatypes 支持复杂的数据类型
- embedded block literals 嵌入块文字
- comments 注释
- It is also better suited for human readability 更适合人类阅读
2018-12-7
本文来自博客园,作者:白乾涛,转载请注明原文链接:https://www.cnblogs.com/baiqiantao/p/10085490.html