JSON三种类型值
- 简单值:使用与JavaScript相同的语法,可以在JSON中表示字符串、数值、布尔值和null,但JSON不支持JavaScript中的特殊值undefined
与JavaScript中的简单值比较区别不大 - 对象:对象作为一种复杂数据类型,表示的是一组有序的键值对。而每个键值对中的值可以是简单值,也可以是复杂类型的值
与JavaScript中的对象字面量对比:
没有末尾的分号(;)
属性必须加上双引号
没有声明变量 - 数组:数组也是一种复杂数据类型,表示一组有序的值的列表,可以通过数组索引来访问其中的值。数组的值也可以是任意类型:简单值、对象、数组
与JavaScript中的数组字面量对比:
没有末尾的分号(;)
没有变量声明
解析与序列化
- JSON对象:早期JSON解析器基本上使用JavaScript的eval( )函数。由于JSON是JavaScript的子集,因此eval( )函数可以解析、解释并返回对象和数组
- ECMAScript5对机械JSON的行为进行规范,定义了全局对象JSON。主流浏览器都支持
- 较早版本的浏览器可以使用shim:https://github.com/douglascrockford/JSON-js(基本上用不着)
- 在旧版本的浏览器中,使用eval( )对JSON数据结构求值存在风险,有可能执行一些恶意代码。对于不能原生支持JSON解析的浏览器,应使用shim
JSON对象方法
- stringfy( ):将一个JavaScript对象序列化为一个JSON字符创,默认情况下,JSON.stringify( )输出的JSON字符串不包含任何空格字符或缩进
在序列化JavaScript对象时,所有函数及原型成员都会被有意忽略,不体现在结果中。且值为undefined的任何属性也会被跳过,结果中最终都是值为有效JSON数据的实例属性
此方法还可以另外接收两个参数:一个为过滤器,可以为数组,也可以是函数;第二个参数是一个选项,表示是否在JSON字符串中保留缩进
如果第二个参数为数组:则只会序列化数组中与序列化对象对应的属性值
如果第二个参数为函数:函数接收两个参数,属性名和数值值。属性名只能是字符串,且值并非键值对结构的值时,键名可以是空字符串。函数返回的值即为相应的键值,如果函数返回undefined,那么相应属性就会被忽略。在其中必须要定义默认返回值,因为一次调用此函数时传入的为空字符串,即JSON的最外层对象
要序列化的对象中的每一个对象都要经过过滤器
此参数可以为一个不大于10的数字或字符串,如果参数大于10则会转换为10,代表缩进几个空格。字符串直接代替缩进的位置,且智育啊设置了该参数都会自动换行 - toJSON( ):可以为任何对象设置toJSON方法,返回任何序列化的值,它都能正常工作
可以返回undefined
如果包含它的对象嵌入在另一个对象中,会导致该对象的值变为null
如果包含它的对象是顶级对象,结果就是undefined
toJSON( )可以作为函数过滤器的补充
对象传入JSON.stringify( )序列化该对象的顺序如下:
1.如果存在toJSON( )方法而且能通过它取得有效的值,则调用该方法。否则按默认顺序执行序列化
2.如果存在了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第一步返回的值
3.对第二步返回的每一个值进行相应的序列化
4.如果提供了第三个参数,执行相应的格式化 - parse( ):将JSON字符串转换为JavaScript值。即使转换出的对象与其他对象具有相同的属性等,但是是两个不同的对象,所以可以用于拷贝对象去除引用。如果传递的参数不是有效的JSON值,则报错
JSON.parse( )也接收另一个参数,次函数为函数,在每个键值对上调用,此函数也称为还原函数,接收两个参数,键、值,返回一个值
如果还原函数返回undefined,则表示要从结果中删除相应的键;如果返回其他值,则将该值插入到结果中