标记语言:JSON & YAML
JSON
JavaScript Object Notation(JavaScript 对象标记)
- 轻量级的文本数据交换格式。
- 独立于编程语言。
- 使用 JavaScript 语法来描述数据对象(使用文本表示 JS 对象)。
- 具有自我描述性,易于理解。
1.1、JSON vs XML
JSON 和 XML 都用于接收 web 服务端的数据,通常使用字符串。
相同点
- 可以被大多数编程语言使用。
- 可通过 JavaScript 解析,可使用 AJAX 传输。
- 具有自我描述性,具有层级结构。
JSON 的优点
- 不需要结束标签,更加简短。
- 支持数组类型。
- 可使用现有的 JavaScript 对象解析,比 XML 更容易解析。
- 对 AJAX 而言,传输速度更快、更简单
- XML:获取 XML 文档,使用 XML DOM 来循环遍历文档,将数据解析并存储在变量中。
- JSON:获取 JSON 字符串,解析 JSON 字符串。
1.2、语法
JSON 语法是 JavaScript 语法的子集。
语法
- 数据用 K-V 键值对表示,数据之间用逗号分隔。
- 大括号
{}
保存对象,中括号[]
保存数组。
数据类型
- 数字:整数或浮点数
- 字符串:写在双引号中
- 逻辑值:true 或 false
- 对象:写在大括号
{}
中 - 数组:写在中括号
[]
中 - 空值:null
JSON 类型表示
- 文件类型:
.json
- MIME 类型:
application/json
1.2.1、JSON 对象
用大括号
{}
表示 JSON 对象,可包含多个 K-V 键值对。
- Key 必须是字符串,Value 可以是任意 JSON 数据类型
- Key 和 Value 中使用冒号
:
分割,多个 K-V 键值对之间使用逗号,
分割。
访问 JSON 对象属性
通过点号.
或中括号[]
访问 JSON 对象
-
获取、修改属性值
-
使用 delete 关键字删除属性
var person = { "name" : "jaywee", "age" : "17", "hobby": ["java","music","basketball"] } // 获取 var obj1 = person.name; var obj2 = person["name"]; // 修改 person.age = 10; person["age"] = 10; // 删除 delete person.hobby; delete person[hobby];
1.2.2、JSON 数组
用中括号
[]
表示 JSON 数组
- 数组元素可以是任意 JSON 数据类型
- 元素之间使用逗号
,
分割。
访问 JSON 数组元素
通过[下标]
访问数组(下标从 0 开始)
-
获取、修改属性值
-
使用 delete 关键字删除属性
var person = { "name" : "jaywee", "age" : "17", "hobby": ["java","music","basketball"] } // 获取 var obj = person.hobby[0]; // 修改 person.hobby[0] = "spring"; // 删除 delete person.hobby[0];
1.3、JSON <-> JS 对象
在前后端开发中,通常使用 JSON 作为数据交换格式。
- 发送端:对象 → 字符串(转换)
- 接收端:字符串 → 对象(解析)
1.3.1、parse
JSON.parse()
:将 JSON 字符串转换为 JavaScript 对象。
var obj = JSON.parse('{ "name":"jaywee", "age":"17" }');
1.3.1、stringify
JSON.stringify()
:将 JavaScript 对象转换为 JSON 字符串。
// obj = { "name":"jaywee", "age":"17" }
var myJson = JSON.stringify(obj);
1.4、JSON 工具类
Java 中常用的 JSON 类库:
jackson、fastjson、Gson、 JSON-lib 等。
1.4.1、Jackson
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.4</version>
</dependency>
使用
ObjectMapper
对象处理 JSON 数据。
示例:转换 Java 对象。
ObjectMapper mapper = new ObjectMapper();
Object obj = new Object();
-
对象 → 其它:重点关注 JSON 字符串
// 转换为JSON字符串 String objJson = mapper.writeValueAsString(obj); // 转换为字节流 byte[] objBytes = mapper.writeValueAsBytes(obj); // 转换为文件 mapper.writeValue(new File("obj.json"), user);
-
解析:
// 读取字符串解析对象 User obj1 = mapper.readValue(objJson, Object.class); // 读取字节流解析对象 User obj2 = mapper.readValue(objBytes, Object.class); // 读取文件解析对象 User obj3 = mapper.readValue(new File("obj.json"), Object.class);
1.4.2、Fastjson
阿里巴巴开发的 Java 类库,比 Jackson 更加方便。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.78</version>
</dependency>
使用
JSON
类的静态方法。
-
对象 → 其它:重点关注 JSON 字符串
// 转换为字符串 String objJson = JSON.toJSONString(obj); // 转换为字节流 byte[] objBytes = JSON.toJSONBytes(obj);
-
解析
// 读取字符串解析对象 Object obj1 = JSON.parse(objJson); // 读取字节流解析对象 Object obj2 = JSON.parse(objBytes);
YAML
YAML
(/ˈjæməl/)可读性高,用于表达数据序列化的格式。
- 历史
- Clark Evans 在 2001 年 5 月首次发表,Ingy döt Net 与 Oren Ben-Kiki 是共同设计者。
- 参考语言:C语言、Python、Perl、XML、RFC 2822
- 命名
- YAML Ain't a Markup Language(YAML 不是标记语言):强调 YAML 以数据为中心。
- Yet Another Markup Language(仍是标记语言):YAML 本质上还是一种标记语言。
2.1、语法
语法
- 层级关系:通过空格(缩进)和换行表示,相同层级的元素左对齐。
- 注解:
#
单行注解 - 大小写敏感,键值对之间有空格
- 使用
---
分隔单个文件的多段 yaml 配置。
数据类型
-
纯量
-
单个不可再分的值(字符串、布尔值、整数、浮点数、null、时间、日期)
-
字符串默认不需要引号,有特殊字符时需使用。
-
日期值默认
ISO-8602
格式(yyyy-MM-dd
)# 字符串 c0: jaywee # 布尔类型 c1: true (或者True) # 整型 c2: 234 # 浮点型 c3: 3.14 # null类型:~表示null c4: ~ # 日期类型 c5: 2018-02-17 # 时间类型:日期T时间+时区 c6: 2018-02-17T15:02:31+08:00
-
-
对象:键值对的集合,又称为映射(mapping)/ 哈希(hash) / 字典(dictionary)
# 推荐 user1: name: jaywee age: 7 # 内置格式(了解) user2: { name: jaywee,age: 7 }
-
数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
# 推荐 pets1: - cat - dog # 内置格式(了解) pets2: [ cat,dog ]
2.2、语言比较
YAML 参考了 JSON,XML 等语言,不过 YAML 仍有自己的特色。
vs JSON
- JSON 语法是 YAML 1.2 的子集,非常接近 YAML1.0 与 1.1 的子集
- 因此大部分 JSON 文件都可以被 YAML 的剖析器剖析。
- JSON 语法结构和 YAML 的内置格式相同
- 大范围的分层(如 list 中有很多个成员)可以使用类似 JSON 的内置格式;
- YAML 标准不建议这样使用,除非能增加可读性。
- YAML 的许多扩展在 JSON 是没有的
- 进阶资料形态
- 关系锚点
- 字符串不需要双引号
- 映射资料形态会储存键值的顺序
- ...
vs XML
YAML 比 XML 语法简洁得多(无需关注标签或引号),并且比 ini 文档功能更强。
但是由于兼容性问题,不同语言间的数据流转建议不要用 YAML
- YAML 中没有 XML 的标签概念,以资料的可扩展性作为替代。
- 在 YAML 规范中,没有类似 XML 的语言定义文件纲要(language-defined document schema descriptors),如验证结构是否正确的文件;
- 不过,存在 YAML 纲要描述语言(YAML schema descriptor language)。
- YAXML
- 用 XML 描述 YAML 的结构:可以让 XML Schema 与 XSLT 转换程式应用在 YAML 之上;
- 在一般使用的情况下,YAML 已经提供了足够的方式来辨认YAML 文件是否正确。