Eric's Blog

json

JSON和JS对象

一 JSON是什么

JSON是基于文本的,轻量的,用于数据交换的,一种格式。

可以看到JSON的定义里面有很多的定语,现在就每个限定解释一下:

1. 基于文本

这里的意思是相对于哪些基于二进制的数据来说的,所以在传输的过程中,传输的是符合JSON格式的字符串。

2. 轻量的

在JSON之前有一种数据格式xml,在表示数据的时候,他需要很多的标签,所以没有JSON轻量。传输相同的数据,JSON占用的带宽更小。

3. 用于数据交换

JSON轻量,且易于读写。前后端交互过程中:js对象=>JSON字符串=>后端对象,可以看到JSON这种数据很容易转化为各自(前后端)容易理解的对象,所以被广泛的用于数据交换。

4. 一种格式

JSON字符串是有很严格的要求的,下面以js对象做一下比较:

  • 逗号 JSON最后一个属性后面不能加逗号。js对象无所谓,可加可不加。
  • 键名 JSON必须用双引号 js对象无所谓,单引号,双引号,不加都可以。
  • 键值 JSON,可以是null,boolean,string,number,数组,或者符合JSON格式 要求的对象。不能是undefined,函数,(+-)Infinity。
    js对象无所谓,都可以。
    
  • 数值 JSON不能有前导0,小数点后面必须有数字。js没限制。

二 JS中与JSON有关的三个JSON函数

1 JSON.stringify

该函数有三个参数,第一个为需要序列化的对象,后面两个不常用,在此不做介绍。
先看下面的代码,然后再说这个函数做的那些不为人知的事情。
Markdown
从上面可以看出:

  • 会把属性转化为双引号。
  • 去掉最后一个属性后面的逗号。
  • boolean,string,number这些包装对象,会被转化为原始值。
  • 不可枚举的属性会直接忽略。
  • NaN,(+-)Infinity,会被转化为null。
  • undefined,函数,Symbol,在数组中都会被转化为null。在非数组对象中都会被忽略掉。

2 JSON.parse

该函数有两个参数,第一个为需要解析的JSON字符串,如果字符串不符合上述JSON字符串的格式要求,会跑出错误。第二个参数为可选的参数,处理解析后的属性然后将其返回。

3 object.toJSON

如果js对象上实现了该方法,当该对象作为参数调用JSON.stringify的时候会首先执行toJSON方法,然后把返回值作为JSON.stringify的参数就行解析。

总结

以上可以看出JSON格式还是挺严格的,但stringify在你看不到的地方为我们做了很多事情,所以一般用这个方法的时候一般不会报错,而parse就不那么友好了,只要不符合格式就会报错,在拿到后台传过来的字符串进行解析的时候,最好try一下,捕获异常。
还有上面三个方法都不兼容<=IE7的浏览器。