JSON
JSON全称JavaScript Object Notation,即JS 对象标记法,JSON不仅限于使用在JS中,是现代开发最广泛使用的数据交换格式。
json是一种轻量级的纯文本数据交换格式。
"轻量级"是指JSON表示数据所需的额外开销较少,数据传输效率更高。比如JSON通过规定字符集(unicode)、默认字符编码(utf-8)和解析嗅探(因为第一个字符是{或[,可以嗅探编码)等方式,相比xml来说不需要头部声明。除此之外,JSON键值对方式表示数据,相对xml需要闭合标签,内容更简洁。实际上,JSON 的语法比 XML 简洁得多------没有闭合标签、没有命名空间、没有头部声明,因此相同数据用 JSON 表示体积更小,传输更快。
"纯文本"是指JSON本质是字符串。本质来讲,JSON字符串与xml、markdown等文本文件相似,都是纯文本字符串。
"数据交换"是指json最常用于网络数据传输,比如web、api等。
"格式"是指json也是一种文件格式,.json用来表示json文本文件,以便操作系统或者应用程序解析。
json格式有两种:
{}大括号包裹的键值对,表示一个对象。键必须用双引号""包裹(不能用单引号),值可以是字符串(双引号""包裹)、数字(整数或小数)、布尔值(true或false)、对象、数组、null。键值对之间用逗号,隔开,最后一个键值对后不需要写逗号。
json
{
"name": "hello",
"score": 91.5,
"football_player": true,
"score_detail": {
"English": 92,
"Math": 91
},
"hobbit": ["football", "ice_ball"],
"girl_friend": null
}
[]中括号包裹的数组,格式要求与上述相同。
json
[
"football",
"ice_ball",
{
"name": "qiangzi",
"age": 32
}
]
很多人会将JS对象和JSON搞混。首先,JS对象是JS语言的一种引用数据格式,虽然也是以键值对方式表示,但是键是对象的属性,一般是用命名变量规则的标志符。而JSON字符串中的键必须是由双引号""包裹。
html
...
<script>
// 定义一个变量,数据类型为对象
var obj = {
name: "张三",
age: 18,
sex: "男"
};
</script>
...
json
{
"name": "张三",
"age": 18,
"sex": "男"
}
其次,JS对象本质是在内存的特殊变量,而JSON字符串本质是文本字符串。只不过,JSON字符串可以解析为JS对象和数组,而JS对象也可以生成JSON字符串进行数据传输与数据持久化。JS提供JSON库进行JSON的解析与生成。
- JS对象生成JSON字符串,使用JSON.stringify()方法进行生成。
html
...
<script>
// 定义一个变量,数据类型为对象
var obj = {
name: "张三",
age: 18,
sex: "男"
};
// 生成JSON字符串
var jsonStr = JSON.stringify(obj)
console.log(jsonStr);
</script>
...
console
{"name":"张三","age":18,"sex":"男"}
- JSON字符串,使用JSON.parse()方法解析成JS对象或数组。
html
...
<script>
// 解析一个JSON字符串为对象
var jsonStr = '{"name":"张三","age":18,"sex":"男"}';
var obj = JSON.parse(jsonStr);
console.log(obj);
// 解析一个JSON字符串为数组
var jsonStr2 = '[{"name":"张三","age":18,"sex":"男"},{"name":"李四","age":19,"sex":"男"}]';
var arr = JSON.parse(jsonStr2);
console.log(arr);
</script>
...
JSON的缺点在于,不能编写注释,如果要写注释,必须要引入新的字段用于注释。
XML
XML全称为eXtensible Markup Language ,可扩展标记语言。XML与HTML相似,都是标记语言,通过标签包裹内容定义元素。
XML具有以下特点:
- 如果有头部声明,必须在第一行,头部声明XML的版本和文本编码。xml的解析器会用ASCII码解析头部声明,再根据解析的文本字符编码,对应解析后续的内容。虽然,XML规范中声明是可选的 ,但如果出现,必须放在文档的最开头(前面不能有任何字符,包括空格)
xml
<?xml version="1.0" encoding="utf-8" ?>
<!-- 以上为头部声明 -->
- 只能有一个根标签。即头部声明之后,由一个根标签包裹所有的其他标签元素。
- 可自定义标签,只需要标签成对出现并闭合。HTML的标签一般是标准预定义的,比如p标签(H5版本也支持自定义标签)。而XML可以自定义标签。并且XML的标签都是成对出现,而不像HTML有单标签。
- 可以自定义标签属性。
- 特殊字符使用特殊字符串。在XML中,有5个预定义的字符实体,用于表示在XML语法中具有特殊意义的字符。当在XML文档的文本内容或属性值中使用这些字符时,必须用对应的实体引用来替代,否则XML解析器会将其误认为是代码语法。比如小于符号
<需要使用<进行替代,因为它是XML标签的开始标记。如果出现在文本中,解析器会认为它是一个新标签的开始。
xml
<?xml version="1.0" encoding="utf-8" ?>
<!-- 以上为头部声明 -->
<!--定义一个根标签,只能由一个-->
<users>
<user id="1">
<name>张三</name>
<age>18</age>
</user>
<user id="2">
<name>李四</name>
<age><20</age>
<!--使用特殊符号<代表小于符号-->
</user>
<user id="3">
<name>王五</name>
<age>22</age>
</user>
</users>
XML可以很方便的表示数据和数据的层次结构,与HTML相似,容易被计算机解析和生成,同时也易于人阅读和编写。因此,XML广泛应用于系统配置文件和数据传输。但由于XML相对于JSON来说,不够轻量化,因此在网络数据传输领域,XML已被JSON广泛取代。