1. JSON

JSON 全称 JavaScript Object Notation,是一种表示结构化数据的数据格式,易于阅读编写,也易于解析和生成。

各种编程语言都有丰富的 JSON 解析库,如 C++ 的 RapidJSON 和 JsonCpp 等,Go 标准库的 encoding/json 包。

JSON 在线格式化网站:https://jsoneditoronline.org/

一个 JSON 例子:

{
  "array": [
    1,
    2,
    3
  ],
  "boolean": true,
  "color": "gold",
  "null": null,
  "number": 123,
  "object": {
    "a": "b",
    "c": "d"
  },
  "string": "Hello World"
}

JSON 有对象、数组、值三种形式,这三种形式结构可以嵌套。

对象

JSON 的对象是一个无序的名称/值对的集合,以左括号{开始以右括号}结束,名称是字符串,名称和值中间是一个冒号:,多个名称/值对用逗号,分隔。

数组

数组是值的有序集合,以左中括号[开始以右中括号]结束,值之间使用逗号,分隔。

值(value)包括数组(string)、数值(number)、布尔值(boolean)、null、对象(object)、数组(array)。

2. XML

XML 全程 Extensible Markup Language,用于结构化存储数据,但是相比于 JSON 更加冗长。

XML 在线格式化网站:https://tool.oschina.net/codeformat/xml

一个 XML 例子:

<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>

首行声明 XML 的版本和编码,首行之后的内容必须由一个根元素包含起来,然后在里面包含其它的子元素。

结构如下:

<root>
  <child>
    <subchild>.....</subchild>
  </child>
</root>

XML 的标签是指小于号<和大于号>包括起来的内容,分为开始标签和结束标签,结束标签是开始标签名称前加一个斜杠/。而元素是匹配的开始标签和结束标签包括起来的内容。

XML 标签名称大小写敏感。

每个元素可以拥有文本内容和属性,属性内容放在开始标签中,文本内容放在开始标签和结束标签中间。

<book category="COOKING">hello world</book>

XML 中文本内容出现了以下字符,解析器会出错,需要将相应字符转码为实体引用:

字符 实体引用 含义
< &lt; 小于
> &gt; 大于
& &amp; 和号
' &apos; 单引号
" &quot; 引号

注释:

<!-- This is a comment --> 

3. YAML

YAML 全称是 YAML Ain’t Markup Language,主要用于编写配置文件。

格式验证网站:https://nodeca.github.io/js-yaml/

YAML 支持三种数据结构:对象、数组、纯量(scalars),三者可以互相组合成复合结构,如下所示。

languages:
 - Ruby
 - Perl
 - Python
websites:
 YAML: yaml.org
 Ruby: ruby-lang.org
 Python: python.org
 Perl: use.perl.org

YAML 大小写敏感,使用缩进表示层级关系,但只允许使用空格而不许使用 tab,缩进空格数组不重要,只要同层级元素对齐即可。

注释是 # 至行末的内容。

对象

对象是键值对的集合,又称为映射、哈希、字典。

键值对用冒号 : 分隔,可以将所有键值对写成一行。

animal: pets

hash: { name: Steve, foo: bar }

数组

数组是一组按次序排列的值,又称为序列、列表。

每行开头用减号 - 表示这是一个数组。

- Cat
- Dog
- Lion

纯量

纯量是单一的不可分的值,包括类型有字符串、布尔值、整数、浮点数、null、时间、日期。

布尔值包括 true 和 false,null 用 ~ 来表示。字符串默认不用引号,但如果包含空格或特殊字符,则需要单引号包含,字符串中的单引号用两个单引号 '' 进行转义,可以多行表示但第二行开始需要缩进,也可以用 |> 保留换行符,|+ 表示文字块末尾换行,|- 表示文字块末尾不换行。

this: |
  Foo
  Bar  
that: >
  Foo
  Bar  

s1: |+
  Foo  
s2: |-
  Foo  

通过两个感叹号 !! 可以强制转换数据类型,如下,整数被转化为字符串:

e: !!str 123

通过锚点 & 和别名 * 可以用于引用,就像变量声明和引用一样,这里 << 表示合并到当前数据。

defaults: &defaults
  adapter:  postgres
  host:     localhost

development:
  database: myapp_development
  <<: *defaults

4. TOML

TOML 全称是 Tom’s Obvious Minimal Language,主要用于编写配置文件。

TOML 基本的构成结构是键值对,用等号 = 分隔,左右必须在同一行。值的类型包含字符串、整数、浮点数、布尔值、日期、时间、数组、内联表。

TOML 键名大小写敏感,不需要引号包含,不过如果键包含点则需要用单引号或双引号包含。

可以用点 . 在一行赋值多层中的值。

name = "Orange"
physical.color = "orange"
physical.shape = "round"
site."google.com" = true

等价于 json 结果如下:

{
  "name": "Orange",
  "physical": {
    "color": "orange",
    "shape": "round"
  },
  "site": {
    "google.com": true
  }
}

注释是 # 至行末的内容。

布尔值包括 true 和 false。字符串用双引号 " 包含,可以用反斜杠 \ 来进行转义,以在字符串中表示特殊字符。三个双引号 """ 包裹起来的是多行字符串。

数组

数组可以混合不同类型的值,可以跨行。

integers = [ 1, 2, 3 ]
colors = [ "红", "黄", "绿" ]

integers = [
  1,
  2,
  3
]

表也称为哈希表或字典,是键值对的集合。

表的开头是表头,用方括号包含,表头也可以包含点 . 表示当前是几层的路径。

[table]

[t1.t2.t3]

在表头的下方,直至下一个表头或文件结束,都属于这个表的键值对。

[table-1]
key1 = "some string"
key2 = 123

[table-2]
key1 = "another string"
key2 = 456

内联表

内联表使用花括号包含起来,中间可以包含键值对,用逗号分隔。

name = { first = "Tom", last = "Preston-Werner" }

表数组

表数组用双方括号包含,表示键名右侧不是一个对象而是一个数组。

[[products]]
name = "Hammer"
sku = 738594937

[[products]]  # 数组里的空表

[[products]]
name = "Nail"
sku = 284758393
color = "gray"

等价于 JSON 中的结构:

{
  "products": [
    { "name": "Hammer", "sku": 738594937 },
    { },
    { "name": "Nail", "sku": 284758393, "color": "gray" }
  ]
}

5. 参考