JavaScript(8)——JSON

时间:2022-06-15 16:01:31

JSON

啊呀呀,终于写到了JSON了。莫名的开心,虽然还是被说进度慢,不过,我不管,我就是开心。恩,好好学习,好好加油。(这是一段毫无逻辑的话,我也不知道说啥了)

JSON是JavaScript的一个严格的子集,利用JavaScript中的一些模式来表示结构化数据。它是一种数据格式,而不是一种编程语言。

【语法】

JSON的语法支持简单值、对象和数组三种类型的值。不支持变量、函数或对象实例。与JavaScript中表示数据的某些语法相同,但是并不局限于JavaScript范畴。

简单值

使用与JavaScript相同的语法,可以在JSON中表示字符串、数值、布尔值和null。但JSON不支持JavaScript中的特殊值undefined。

JavaScript字符串与JSON字符串的最大区别在于,JSON字符串必须使用双引号。

对象

对象作为一种复杂数据类型,表示一种无序的键值对儿。而每个键值对儿中的值可以是简单值,也可以是复杂值。

与JavaScript的对象字面量相比,JSON对象一没有声明变量(JSON中设有变量的概念),二是没有末尾的分号。属性的值可以是简单值有,也可以是复杂类型值。

数组

也是一种复杂数据类型,表示一组有序值的列表,可以通过数值索引来访问其中的值。数组的值也可以是任意类型——简单值、对象或数组。

JSON数组采用的就是JavaScript中的数组字面量形式。JSON数组也没有变量和分号。把数组和对象结合起来,可以构成更复杂的数据集合。

对象和数组通常是JSON数据结构的最外层形式,利用他们能够创造出各种各样的数据结构。

【解析与序列化】

JSON拥有与JavaScript类似的语法,也可以把JSON数据结构解析为有用的JavaScript对象。

JSON对象有stringify()和parse()两种方法。在最简单的情况下,这两种方法分别用于把JavaScript对象序列化为JSON字符串和把JSON字符串解析为原生JavaScript值。如下

var book={
title:"professional JavaScript",
authors:[
"Nicholas C. Zakas"
],
edition:3,
year:2011
};
var jaonText=JSON.stringify(book);

这个例子使用JSON.stringify()把一个JavaScript对象序列化为一个JSON字符串,然后将它保存在变量jsonText中。

【序列化选项】

JSON.stringify()可以接收两个参数,一个参数是个 过滤器,可以是一个数组,也可以是一个函数。第二个参数是一个选项,表示是否在JSON字符串中保留缩进。这两个参数用于指定以不同方式序列化JavaScript对象。

过滤结果

如果过滤参数是数组,那么JSON.stringify()的结果中将只包含数组中列出的属性。

为了改变序列化对象的结果,函数返回的值就是相应键的值。如果函数返回了undefined,那么相应的属性会被忽略。

要序列化的对象中的每一个对象都要经过过滤器。

字符串缩进

JSON.stringify()的方法的第三个参数用于控制结果中的缩进和空白符。如果这个参数是一个数值,那它表示的是每个级别缩进的空格数。如果缩进参数是一个字符串而非数值,则这个字符串将在JSON字符串中被用作缩进字符(不再使用空格)。缩进字符串最长不能超过10个字符长。

toJSON()方法

假设把一个对象传入JSON.stringify(),序列化该对象的顺序如下

(1)如果存在toJSON()方法而且能通过他取得有效的值,则调用该方法,否则,返回对象本身。

(2)如果提供了第二个参数,应用这个函数过滤器。传入函数的过滤器的值是第(1)步返回的值。

(3)对第(2)步返回的值进行相应的序列化。

(4)如果提供了第三个参数,执行相应的格式。

【解析选项】

JSON.parse()方法也可以接收另一个参数,该参数是一个函数(还原函数),将在每个键值对儿上调用。如果还原函数返回undefined,则表示要从结果中删除相应的键。如果返回其他值,则将该值插入到结果中。