1. 概念

JSON是JavaScript的一个严格子集,利用了JavaScript中的一些模式来表示结构化数据。与JavaScript对象字面量相比,JSON对象有三个地方不一样,首先,没有声明变量,其次末尾没有分号,第三,JSON对象的属性必须加双引号

2. JSON字符串化 -JSON.stringify

所有安全的JSON值都可以使用JSON.stringify字符串化,所谓安全的JSON值是不包含 undefined function symbol 及循环引用的对象
JSON.stringify在对象中遇到undefined function 和symbol时会自动将其忽略,在数组中则会返回null(以保证单元位置不变),对包含循环应用的对象执行JSON.stringify会出错。

如果对象定义了toJSON方法,JSON字符串化时会首先调用该方法,然后用它的返回值进行序列化,如果要对含有非法JSON值的对象序列化或者对象中的某些值无法被序列化时,就需要定义toJSON方法来返回一个安全的JSON值
**

2.1 语法

JSON.stringify(object,replacer,space)
1.replacer:它可以是一个数组或函数,用来指定对象序列化过程中哪些属性应该被处理。如果replacer是一个数组,包含要序列化处理的对象属性名,其他的属性会被忽略,如果replacer是一个函数,它会对对象本身调用一次,然后对对象中的每个属性各调用一次。

  1. var a = {
  2. "b" : 42,
  3. "c" : 42,
  4. "d" : [1,2,3]
  5. }
  6. JSON.stringify(a,["b,""c"]) //"{"b":42,"c":"42"}"
  7. JSON.stringify(a,function(k,v) {
  8. if(k !== "c") {
  9. return v
  10. }
  11. }) //"{"b":42,"d":[1,2,3]}"

2.space:用来指定输出的缩进格式,space是正整数时指定每一级缩进的字符数,它还可以是字符串,表示缩进用指定的字符串,而非空格

2.2 序列化规则顺序

  1. 如果被序列化的对象存在toJSON方法并且能通过它取得有效的值,则调用该方法。否则,返回对象本身。
  2. 如果提供了第二个参数,应用这个数组或函数过滤器,传入函数过滤器的值是第1步返回的值。
  3. 对第二部返回的每个值进行响应的序列化。
  4. 如果提供了第三个参数,执行响应的格式化。

3. 反序列化 - JSON.parse()

JSON.parse(json,reviver)
reviver:还原函数,接受两个参数,一个键一个值,如果还原函数返回undefined,则表示从结果中删除响应的键值对,如果返回其他值,则将该值插入到结果中,在将日期字符串转换为Date对象时,经常要用到还原函数。如下:

  1. var book = {
  2. "title": "Professional JavaScript",
  3. "authors": [
  4. "Nicholas C.Zakas"
  5. ],
  6. edition: 3,
  7. year: 2011,
  8. releaseDate: new Date(2011,11,1)
  9. }
  10. var jsonText = JSON.stringify(book)
  11. var bookCopy = JSON.parse(jsonText,function(key, value) {
  12. if(key === 'releaseDate'){
  13. return new Date(value)
  14. }else{
  15. return value
  16. }
  17. })