javascript JSON详解

来源:互联网 发布:银联钱包 网络不给力 编辑:程序博客网 时间:2024/06/16 04:12
json是一种数据格式。

json的语法
它可以表示一下三种类型的值:
简单值:使用与js相同的语法可以在json中表示字符串、数值、布尔值和null。但是json不支持js的undefined。
对象:对象作为一种复杂的数据类型,表示的是一组有序的键值对。每个键值对的值可以是简单值,也可以是复杂数据类型的值
数组:数组也是一种复杂数据类型,表示一组有有序的的值列表,可以通过数值索引来访问其中的值。数组的值也可以是任意类型,简单值,对象,数组均可。
json不支持变量,函数,对象实例,它就是一种表示结构化数据的格式。

js字符串与json最大的区别在于json字符串必须使用双引号,单引号会导致语法错误。
与js的对象字面量相比,json对象有两个地方不一样。首先,没有声明变量。其次,没有末尾的分毫。对象的属性必须加双引号,这是json必须的。同一个对象不允许出现两个同名的属性。json的数组格式类似js的数组格式。

解析与序列化
json流行的最主要的原因是因为json数据结构可以解析为js的对象。早期的json解析器基本上是使用js的eval()函数。对于较早版本的浏览器,可以使用一个 shim:https://github.com/douglacrockford/JSON-js 。对于那些不能原生支持JSON解析的浏览器,使用shim是最佳选择。ECMAScript 5对解析JSON的行为进行了规范,定义了全局对象JSON。
JSON对象有两个方法:stringify()和parse()。在最简单的情况下,这两个方法分别用于把javascript对象序列化为JSON字符串和把JSON字符串解析为原声的javascript值。
在序列化JavaScript对象时,所有函数及原型成员被有意忽略,不体现在结果中。值为undefined的任何属性都会被跳过。将JSON字符串传递给parse()函数,会得到相应的JavaScript值。注意,序列化之前的值和解析之后的值是两个独立的没有任何关联的对象。如果传递给JSON.parse()的字符串不是有效地JSON,该方法会抛出错误。
实际上,JSON.stringify()除了要序列化的Javascript对象外,还可以接收另外两个参数,这两个参数用于指定以不同方式序列化javascript对象。第一个参数是一个过滤器,可以是一个数组,也可以是一个函数。第二个参数是一个选项,表示是否在JSON字符串中保留锁紧。单独或组合使用这两个参数,可以全面化的控制JSON序列化。
当JSON.stringify()的第二个参数是一个数组。数组中包含的属性与将要序列化的对象中的属性是对应的。因此在返回结果中,只会包含这些属性。如果第二个参数是参数,传入的函数接收两个参数,属性名和属性值。根据属性名可以知道应该如何处理序列化的对象中的属性。属性名只能是字符串,而在值并非键值对结构的值时,键名可以是空字符串。为了改变序列化对象的结果,函数返回值就是相应键的值。如果返回undefined作为属性值,则表示跳过这个属性。
当JSON.stringify()的第三个参数是用于控制结果中的缩进和空白符。如果这个参数是一个数值,表示是每个级别缩进的空格数。最大的缩进空格数是10,超过10,则设定为10.如果缩进字符串是一个字符串而非数值,则在这个字符串将在JSON字符串中被用作缩进字符。缩进字符串最多也只出现10个字符长度。
toJSON()方法,为任何对象添加,它会在对象被序列化是调用,返回指定的数据,而不是整个对象的序列化数据。
toJSON()方法可以作为函数过滤器的补充,因此理解序列化内部顺序十分重要。假设把一个对象传入JSON.stringify(),序列化该对象的顺序如下:
1.如果存在toJSON()方法而且能通过它取得有效地值,则调用该方法。否则按照默认顺序执行序列化。
2.如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第一步的返回值。
3.对第2步返回的每个值进行相应的序列化
4.如果提供了第三个参数,执行相应的格式化
这个顺序很重要

解析JSON
JSON.parse()方法也可以接收另一个参数,该参数是一个函数,将在每个键值对上调用。这个函数被称为还原函数,它与JSON.stringify()方法中的过滤函数有些雷系,都接收键值对,返回一个值。如果还原函数返回undefined,则表示要从结果中删除相应的键,如果返回其他值,则将改值插入到结果中。








原创粉丝点击