JSON

漫长学习路

字号+ 作者:H5之家 来源:H5之家 2017-12-05 12:20 我要评论( )

语法JSON的语法可以表示以下三种类型的值。简单值:使用与javaScrpt相同的语法,可以在JSON中表示字符串,数值,布尔值和null。但JSON不支持JavaScript中的特殊

语法

JSON的语法可以表示以下三种类型的值。

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

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

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

JSON不支持变量,函数或对象实例,它就是一种表示结构化数据的格式,虽然与JavaScript中表示数据的某些语法相同,但它并不局限于JavaScript的范畴。

简单值

最简单的JSON数据形式就是简单值,例如 1 这是JSON表示数值是1的方式,类似地,下面是JSON表示字符串的方式:

"Hello world!"

JavaScript字符串与JSON字符串最大区别在于,JSON字符串必须使用双引号(单引号有语法错误)。

布尔值和null也是有效的JSON形式,但是,在实际应用中,JSON更多地用来表示更复杂的数据结构,而简单值只是数据结构的一部分。

对象

JSON中的对象与JavaScript字面量稍微有一些不同。下面是一个JavaScript中的对象字面量;

var person={ name="张三", age=19 };JSON表述对象的方式如下:

{ "name"="张三", "age"=19 }
与上面的对象字变量相比,JOSN对象有两个地方不一样。首先,没有声明变量(JSON中没有变量的概念)。其实没有末尾的分号,再说一遍,对象的属性必须加双引号,属性的值可以是简单值,也可以是复杂类型值,因此可以像下面这样在对象中嵌入对象:

{ "name"="张三", "age"=19, "scchool":{ "name":"MIT", "address":"北京新东方" } }
这个例子在定级对象中嵌入了学校信息,虽然有两个name,但是属于不同的对象,因此这样完全没有问题。

数组

JSON中的第二种复杂数据类型是数组,JOSN数组采用的就是JAVAScript中的数组字面量形式,如下面是JavaScript中的数组字面量;

var values=[23,'a',true];在JSON中,可以采用同样的语法表示同一数组:

[25,'a',true]

解析与序列化

JSON之所以流行,拥有与JS类似的语法并不是全部原因,更重要的原因是JSON可以被解析为有用的JS对象,

JOSN对象

早期的JSON解析器基本上就是使用JavaScript的eval()函数。由于JSON是JavaScript的语法子集,因此eval()函数可以解析,解释并返回JavaScript对象和数组、ECMAScript对解析JSON的行为进行规范,定义了JSON对象。

JSON对象有两个方法,stringify()和parse();这两个方法分别用于把javaScript对象序列化为JSON字符串和把JSON字符串解析为原生JavaScript值。

parse用于从一个字符串中解析出json对象,如

var str = '{"name":"zhangsan","age":"23"}'

结果:

JSON.parse(str)

Object


注意:单引号写在{}外,每个属性名都必须用双引号,否则会抛出异常。


stringify()用于从一个对象解析出字符串,如

var a = {a:1,b:2}

结果:

JSON.stringify(a)

"{"a":1,"b":2}"

序列化选项

实际上,JSON.stringify()除了要序列化JavaScript对象外,还可以接收另外两个参数,这两个参数用于指定以不同的方式序列化JavaScript对象,第一个参数是个过滤器,可以是一个数组,也可以是一个数组;第二个参数是一个选项,表示是否在JSON字符串中保留缩进,单独或组合使用这两个参数,可以更全面深入地控制JSON序列化。

var book={"title":"javaScript", "authors":["Nicholas c.zaks" ], edition:3, year:2011 }; var jsonText=JSON.stringify(book,["title","edition"]); alert(jsonText);这样打印出的结果就是包含title和edition的;

2.字符串缩进

JSON.stringify()方法的第三个参数用于控制结果中的随进和空白符,如果这个参数是一个数值,那么它表示我们缩进的级别;

var jsonText=JSON.stringify(book,["title","edition"],2);比如这里传入一个2,那么就会缩入2格;

toJSON()方法

有的时候JSON.stringify()方法还是不能满足某些对象自定义序列化的需求。在这些情况下可以通过对象调用这个方法,返回其自身的JOSN数据格式。

var book={"title":"javaScript", "authors":["Nicholas c.zaks" ], edition:3, year:2011, toJSON:function(){ return this.title; } }; alert(book.toJSON());
这里toJSON()的方法,返回图书的书名,如果我们使用JSON.stringify()方法序列字符串的时候,有的字符串不能正常的序列化,或者需要一些特殊的序列化,比如这里想把返回的值固定一下为undefined都是可以的;

toJSON()可以作为函数过滤器的补充,因此理解序列化内部顺序就十分重要;

序列化该对象的顺序如下:

1.如果存在toJOSN()方法而且能通过它取得有效的值,则调用该方法,否则按照默认加载顺序序列化。

2.如果有第二个参数,应用这个函数过滤器。传入函数过滤器的值是第1步返回的值。

3.对第2步返回的每个值进行对应的序列化。

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

解析选项

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
网友点评