0%

JSON&XML&YAML

常见的信息标注方式有三种,分别是XML、JSON、YAML。HTML是XML的变种,也属于XML格式。下面简单的介绍比较三种信息标注方式。

直入主题:三种语言简介

XML

  • XML:eXtensible Markup Language , 其构成单位是Tag标签,且标签内包含有名称属性等信息如图:

​ 其中空元素可通过一个<>表示 , 注释通过 表示

1
2
3
4
#XML空元素表示
<img src="china.jpg" size="10" />
#XML注释格式
<!-- This is a comment -->

总结:XML格式共包含三种样式

1
2
3
<name> ... </name>
<name />
<!-- -->

JSON

  • JSON:JavaScript Object Notation , 有类型的键值对表示方式

总结:JSON格式包含三种样式

1
2
3
4
5
6
#普通键值对表示
"key" : "Value"
#多值键值对表示
"key" : ["Value1","Value2"]
#键值对嵌套表示
"key" : {"subkey" : "subvalue"}

YAML

  • YAML:Ain’t Markup Language , 无类型键值对

其表示各种关系情况:

1
2
3
4
5
6
7
8
9
10
11
12
#缩进表示所属关系,同Python
name:
newName : 北京理工
OldName : 延安自然科学院
# “-” 表达并列关系
name:
- 北京理工大学
- 延安自然科学院

# “|”表达整块数据
text: |
北京理工大学创立与......

总结:三种表示形式如下

1
2
3
4
5
6
7
8
9
key : value

key : #comment
- value1
- value2

key:
subkey : value

实例比较

XML:

1
2
3
4
5
6
7
8
9
10
11
12
13
<person>
<firstName>Tian</firstName>
<lastName>Song</lastName>
<address>
<streetAddr>中关村南大街5号</streetAddr>
<city>北京市</city>
<zipcode>100081</zipcode>
</address>
<prof>ComputerSystem</prof>
<prof>Security</prof>
</person>
<!--最早的通用标记语言,可扩展性好,但很繁琐 -->
<!-- 用于INTERNET 信息交互与传递 -->

JSON:

1
2
3
4
5
6
7
8
9
10
{
“firstName”: “Tian”,
“lastName”: “Song”,
“address”:{“streetAddr”: “中关村南大街5号” ,
“city”: “北京市” ,
“zipcode”: “100081”},
“prof”:[“ComputerSystem”, “Security”]
}
#信息有类型,适合程序处理,比XML简洁
#用于移动英语云端与节点信息通信,无注释

YAML:

1
2
3
4
5
6
7
8
9
10
11
firstName: Tian
lastName: Song
address:
streetAddr:中关村南大街5号
city:北京市
zipcode: 100081
prof:
‐Computer System
‐Security
# 信息无类型,文本信息比例最高,可读性好
# 常用于各类系统配置文件,有注释易读

XML,JSON,YAML 对比分析

XML,JSON,YAML是在编程过程中常见的数据交互语言(inter-change Language),常用于配置文件与数据传输。

数据交互语言也是我最近才看到的一种定义,那么其用户不外乎就是两种:机器(Python,Java,etc)与人(Developer)。根据语言的用处不同,自然要求也不一样,如下所示:

  • 配置文件时:
    • 用户:人与机器
    • 要求:首要人能编写与阅读,其次机器能阅读
  • 数据传输时:
    • 用户:机器与机器
    • 要求:首要机器能阅读,其次人也要阅读

常见的语言要求如下:

  • 便于人类阅读理解;
  • 具有强大的表达能力,除了键值对外还能支持数组、引用等表达方式;能表达层级关系
  • 便于书写,包括纯手打和使用IDE
  • 存储空间小

但上面提到的性质很多时刻是冲突的,例如要表达复杂的数据对象,就需要更多的语言规范,可阅读性会下降,存储空间往往会增大。这也就造成了在面向不同的要求时,大家构造出多种数据交互语言。下面这些是我在查询三者之间关系时看到的不同见解,特整理如下:

主观感受方面

参考博客

上面参考博客中,作者将三种语言进行了很简单的主观对比,虽然没有很细致,但是我认为主干抓到啦,而且很明显不是那种顾左右而言它的缝合怪,需要向其学习。我简单的将自己的感想与其内容进行总结如下:

XML,JSON,YAML均是数据交互语言(Inter-change Language),那么表示数据表示便是首要特点。数据表示可以笼统的分为两部分:

  1. 映射表示:Key-value或者说Mapping
  2. 层次表示:层级关系或者说嵌套

通常来说,能够准确表示映射关系与层次关系,就能够准确的描述数据的基本结构,这与编程语言中类的定义非常类似,只是没有方法罢了。从这个角度分析XML,JSON,YAML均能够做到,只是各有优缺点。那么我们可以从映射与层次两方面对三种数据语言进行简单分析;

XML

例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
<person>
<firstName>Tian</firstName>
<lastName>Song</lastName>
<address>
<streetAddr>中关村南大街5号</streetAddr>
<city>北京市</city>
<zipcode>100081</zipcode>
</address>
<prof>ComputerSystem</prof>
<prof>Security</prof>
</person>
<!--最早的通用标记语言,可扩展性好,但很繁琐 -->
<!-- 用于INTERNET 信息交互与传递 -->
简单分析:

在XML中,key-value通过 <key> value <\key>表示,在XML中通常将<key>称为Tag,每个Tag都有对应的tag将其闭合。tag之间可以嵌套。XML的注释需要写在<!---->中,可以是多行的。

在上面的示例中,标签<person>的嵌套有<firstName> <lastName> <address> <prof>标签,层层嵌套形成了一种树状结构。在value中的内容通常称为data,<key>中可以添加attribute,称为metaData,用以标识数据的特性而不是数据内容。value 与 attribute的取舍问题,需要编程人员自行顶多,我在详解XML的文档中有表述。

优点:

  1. 注重标记,典型树形结构;
  2. 以Tag为基础构造,理解简单;
  3. 可以注释。

缺点:

  1. key重复,造成数据冗余,例如<prof>
  2. 没有数据结构符号。

JSON

例子:
1
2
3
4
5
6
7
8
{
“firstName”: “Tian”,
“lastName”: “Song”,
“address”:{“streetAddr”: “中关村南大街5号” ,
“city”: “北京市” ,
“zipcode”: “100081”},
“prof”:[“ComputerSystem”, “Security”]
}
简单分析:

在JSON中,key-value用过键值对"key":value进行标识。而value可以是单纯的标量,也可以对象({})或数组([])等以此构成了层次关系,常用作数据传输,在JSON中存在两种数据结构:

  • 对象:{}标识,可表示复杂的数据结构、字典、集合等等
  • 数组:[]标识,可表示序列(列表、数组)等

但是JSON中不存在注释,减少了不必要的数据传输。

优点:

  1. 数据简洁,相比XML;
  2. 存在数据结构;

缺点:

  1. 没有注释,增加人的阅读难度;

YAML

例子:
1
2
3
4
5
6
7
8
9
10
11
firstName: Tian
lastName: Song
address:
streetAddr:中关村南大街5号
city:北京市
zipcode: 100081
prof:
‐Computer System
‐Security
# 信息无类型,文本信息比例最高,可读性好
# 常用于各类系统配置文件,有注释易读
简单分析:

YAML中key-value通过 key:value标识,通过 缩进 标识层级关系,常用作配置文件

其特点在于,key,value均可以直接表示,不用像JSON那样通过双引号标识,当然你要限定使用双引号(强制类型转换)也是可以的,这一点与Python风格一致。存在两种数据结构,与JSON一样:

  • 对象:key-value 标识
  • 数组:- 标识

注释通过 # 标识,但是不允许多行注释存在。

优点:

  1. 数据表示简洁;
  2. 相较于JSON,可读性更好,但也差不多;
  3. 存在注释(JSON);
  4. 存在数据结构(XML);
  5. 存在引用机制(JSON,XML)

缺点:

  1. 缩进控制层次不方便;
  2. 没有多行注释(XML).

YAML可以说是JSON的加强版,主要体现在加入了注释和引用机制,同时省去了让人眼花的方括号和花括号。使用缩进而不是括号表达层级关系可以让我们能用肉眼看出层级关系,而不需要使用编辑器或是IDE寻找配对的括号,同时省去了不必要的空行,提高了可读性。YAML与JSON相比在加强了表达能力的同时提高了可读性,可以说是在复杂项目中最佳的配置语言了。

小结

三种数据交互语言(Inter-change Language),因其历史局限性或者应用不同,各有其特点,但也都是一种数据的表示方式罢了,从key-value,Mapping两个角度分析看,可以迅速掌握其差异点,有利于更好的理解语言特点。对于细节差异,并不需要一一对比分析,浪费时间也没必要。

脉络方面

参考博客

作者以历史为脉络整理了,各语言的特点与差异,可作为一种知识补充。

数据维度方面

参考博客

作者提到的数据维度是很有意思的角度,时间所限不一一整理啦。