javascrpt之JSON全解析
来源:互联网 发布:淘宝网尿道炎药品注射 编辑:程序博客网 时间:2024/05/25 16:39
javascrpt之JSON全解析
过去有一段时间,XML是互联网上传输结构化数据的事实标准,突出的特点是服务器与服务器之间的通信。缺点是过于繁琐,冗长。2005年,Douglas Crockford把JSON(JavaScript Object Notation,JavaScript对象表示法)作为IETFRFC4627提交给IETF,实际上JSON的应用早在2001年就已经开始了。JSON是JavaScript的一个严格的子集,利用了JavaScript中的一些模式来表示结构化数据。Crockford认为与XML相比,JSON是在JavaScript中读写结构化数据的更好的方式,因为可以把JSON直接传给eval(),而不必创建DOM对象。JSON是一种数据格式,不是一种编程语言。虽然有相同的语法形式,但是JSON并不从属于JavaScript。而且,并不是只有JavaScript才使用JSON,很多编程语言都有针对JSON的解析器和序列化器。
1、语法
JSON的语法可以表示以下三种类型的值。
- 简单值 - 使用与JavaScript相同的语法,可以在JSON中表示字符串、数值、布尔值和null。
- 对象 - 对象作为一种复杂的数据类型,表示一组有序的键值对。每个键值对中的值可以是简单值,也可以是复杂数据类型的值。
- 数组 - 数组也是一种复杂的数据类型,表示一组有序的值得列表,可以通过数值索引来访问其中的值。数组的值可以可是任意类型——简单值、对象或数组。
JSON不支持变量、函数或对象实例,它就是一种表示结构化数据的格式,虽然与JavaScript中表示数据的某些语法相同,但它并不局限于JavaScript范畴。
1.1、简单值
简单值是JSON中最简单的数据形式。例如
1 ——JSON中表示数值1的方法
“hello”——JSON中表示字符串的方法
JavaScript字符串和JSON字符串的最大区别在于,JSON字符串必须使用双引号,单引号会导致语法错误。
布尔值和null也是有效的JSON形式,但是JSON不支持JavaScript中的特殊值undefined。在实际应用中,JSON更多的用来表示更复杂的数据结构,而简单值只是真个数据结构中的一部分。
1.2、对象
下面这是一个JavaScript中的对象字面量:
var person = { name: "Lian", age: 23};
JSON表示上述对象的方式如下:
{ "nme": "Lian", "age": 23}
JSON中的对象与JavaScript中的对象字面量有三个地方不一样。第一,没有声明变量。第二,没有末尾分号。第三,JavaScript中对象的属性名可以没有引号,可以是单引号,也可以是双引号,而JSON中对象的属性必须是双引号。JSON属性的值可以是简单值也可以是复杂类型的值,例如可以在对象中嵌套对象。
{ "nme": "Lian", "age": 23, "school": { "name": "College", "location": "Shanxi Xian" }}
在顶级对象中嵌入了学校的信息,虽然有两个“name”属性,但由于它们分别属于不同的对象,因此不会出现错误。不过,同一个对象中绝对不应该出现两个同名属性。
1.3、数组
JSON中的第二种复杂数据类型是数组,JSON数组采用的就是JavaScript中的数组字面量形式。例如,下面这是JavaScript中的数组字面量:
var value = [36, "hello" true];
在JSON中,可以采用同样的语法表示同一个数组:
[36, "hello", true]
与对象一样,JSON数组也没有变量和分号。把数组和对象结合起来,可以构成更加复杂的数据集合。
[ { "title": "JSON全解析(一)", "author": [ "Lian" ], "edition": 1, "year": 2017 }, { "title": "JSON全解析(二)", "author": [ "Lian" ], "edition": 2, "year": 2017 }, { "title": "JSON全解析(三)", "author": [ "Lian", "Yu", "Jie" ], "edition": 3, "year": 2017 }, { "title": "JSON全解析(四)", "author": [ "Lian" ], "edition": 4, "year": 2017 }]
在这个数组中包含了一些表示文章的对象。每个对象都有几个属性,其中“authors”属性的值又是一个数组。对象和数组通常是JSON数据结构的最外层形式,利用它们能够创造出各种各样的数据结构。
2、解析与序列化
JSON流行的原因之一是拥有与JavaScript类似的语法,更重要的一个原因是,可以把JSON数据结构解析为有用的JavaScript对象。与XML数据结构要解析成DOM文档而且从中提取数据极为麻烦相比,JSON可以解析为JavaScript对象的优势极其明显。以上个例子中包含一组文章的JSON数据结构为例,解析为JavaScript对象并保存到变量article中,只需要下面一行简单的代码就可以取得第三篇文章的名字:
article[2].title
而在DOM结构中查找这些数据的代码:
document.getElementsByTagName("article")[2].getAttribute("title")
明显,通过这种方法调用过于冗长,繁琐。
2.1、JSON对象
最早的时候,JSON解析器基本上就是使用JavaScript的eval()函数。由于JSON是JavaScript语法的子集,因此eval()函数可以解析、解释并返回JavaScript对象和数组。但是在旧版本的浏览器中,使用eval()对JSON数据结构求值存在风险,因为可能会执行一些错误代码。
因为这些原因,ECMAScript 5 对解析JSON的行为进行了规范,定义了全局对象JSON。JSON对象有两个方法:stringify()和parse()。在最简单的情况下,这两个方法分别用于把JavaScript对象序列化为JSON字符串和把JSON字符串解析为原生JavaScript值。例如:
var article = { title: "JSON全解析(一)", author: [ "Lian" ], edition: 1, year: 2017};var jsonText = JSON.stringify(article);
这个例子使用JSON.stringify()把一个JavaScript对象序列化为一个 JSON字符串,然后将它保存在变量jsonText中。默认情况下,JSON.stringify()方法输出的JSON字符串不包含任何空格字符或者缩进,因此保存在jsonText中的字符串如下所示:
"{"title":"JSON全解析(一)","author":["Lian"],"edition":1,"year":2017}"
在序列化JavaScript对象时,所有函数及原型成员都会被有意忽略,不会在结果中出现。此外,值为undefined的任何属性也会被跳过,最终结果都是值为有效JSON数据类型的实例属性。
再将JSON字符串直接传递给JSON.parse()方法,就可以得到相应的JavaScript的值。
var articleCopy = JSON.parse(jsonText);{title: "JSON全解析(一)", author: Array[1], edition: 1, year: 2017}
虽然article与articleCopy具有相同的属性,但它们是两个独立的、没有任何关系的对象。,如果传递给JSON.parse()的字符串不是有效的JSON,该方法就会抛出错误。
参考文献
- JavaScript高级程序设计