End

序列化 配置 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 是由六个构造字符、字符串、数字、三个字面值组成的一个标记符序列
    • 六个构造字符:[]{}:,
    • 三个字面值:truefalsenull,必须使用小写的英文
  • 六个构造字符前后允许存在任意个无意义的空白符:空格\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
  • 数字允许使用小数点开头或结尾:.0077.
  • 数字前面可以有正号+或负号-
  • 数字可以使用正无穷大Infinity、负无穷大-Infinity、和 Nan 来表示
  • 支持单行注释//和多行注释/* */
  • 允许在任何在 json5 相关符号前后出现多余的空白符

支持的空白符

white-space

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 为假
  • 整数:6660001_00000b1010(二进制表示)
  • 浮点数:3.146.8523015e+5(科学计数法)
  • 空:nullNull~,不指定值默认也是空
  • 日期:日期必须使用 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 a serialization format or serving up data for your APIs.
  • JSON is best suited as a serialization format. It is much more explicit 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

posted @ 2018-12-07 21:58  白乾涛  阅读(643)  评论(0编辑  收藏  举报