首页 > 技术文章 > json对象和json字符串

xumqfaith 2018-06-03 21:34 原文

Javascript字符串与JSON字符串的最大区别在于,JSON字符串必须使用双引号(单引号会导致语法错误)

与Javascript的对象字面量相比,JSON对象有两个地方不一样。首先,没有声明变量(JSON中没有变量的概念)。其次,没有末尾的分号(因为这不是Javascript语句,所以不用分号)。

JSON对象的属性必须加双引号。

JSON对象有两个方法:

stringify(),把Javascript对象序列化为JSON字符串

parse(),把JSON字符串解析为Javascript值

在默认情况下,JSON.stringify()输出的JSON字符串不包含任何空格字符串或是缩进。

在序列化Javascript对象时,所有函数及原型成员都会被忽略,不体现结果中,此外,值为undefined的任何属性也都会被跳过,结果中最终都是值为有效JSON数据类型的

实例属性。

  var obj={
            name:'Jack',
            age:29,
            school:{
                name:'Middle School',
                age:'',
                location:undefined
              }
        }
    var c = JSON.stringify(obj)
    console.log(c)//{"name":"Jack","age":29,"school":{"name":"Middle School","age":""}}因为location的值是undefined,所以输出的值location已经过滤掉了
  var d = JSON.parse(c);

  一般情况下,d 与 obj 具有相同的属性,但是它们是两个独立的、没有任何关系的对象。

如果,传给JSON.parse()的字符串不是有效的JSON,该方法会抛出错误。

JSON的序列化选项

 JSON.stringify()除了要序列化的Javascript对象外,还可以接受2个参数,这两个参数用于指定以不同的方式序列化Javascript对象。第一个参数是个过滤器,也可以是个函数;第二个参数是一个选项,表示是否在JSON中保留缩进。

    var obj={
              name:'Jack',
              age:29,
              school:{
                name:'Middle School',
                age:'',
                location:undefined
              }
          }
          var a = JSON.stringify(obj,["name","age"]) //如果参数是个数组,那么JSON.stringify()的结果中将只保留数组中列出的属性
          console.log(a)//{"name":"Jack","age":29}

当第二个参数是一个函数的时候

      var obj={
                name:'Jack',
                age:29,
                school:{
                  name:'Middle School',
                  age:'',
                  location:undefined
                }
            }
            var a = JSON.stringify(obj,function(key,value){ //相当于遍历对象
                switch (key) {
                  case 'name': 
                return 'Jane'; //当key值为name的时候,返回的value值为Jane,注意,是对象里面所有key值为name,嵌套的也包括在内
                        break;
                   case 'age':
               return value+1;//当keu值为age的时候,将原来的值+1
                        break;
                }
                return value
            })
            console.log(a)//{"name":"Jane","age":30,"school":{"name":"Jane","age":"1"}}

 第三个参数

        var obj={
                  name:'Jack',
                  age:29,
                  school:{
                    name:'Middle School',
                    age:'',
                    location:undefined
                  }
              }
                console.log(obj)
                var a = JSON.stringify(obj,null,4)
                console.log(a)
                var b = JSON.stringify(obj,null,2)
                console.log(b)
                var c = JSON.stringify(obj,null,'---')
                console.log(c)

对应的结果

toJSON()方法

  var d=new Date();
  var b =  d.toJSON();
  console.log(b)//2018-06-03T14:56:57.322Z

某些原生对象存在toJSON()方法。

toJSON()对象可以作为函数过滤器的补充。

把一个对象传入进JSON.stringify(),序列化的过程如下:

(1)如果存在toJSON()方法,而且能通过它取得有效的值,则调用方法。否则,调用本身。

(2)如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第(1)步返回的值。

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

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

解析函数

JSON.parse()方法也可以接收另一个参数,该参数是一个函数,将在每个键值对儿上调用。这个函数可以称为还原函数。

如果还原函数返回undefined,则表示要从结果中删除相应的键;如果返回其他的值,则将该值插入到结果中。在将日期字符串转换为Date对象时,经常要用到还原函数。

        var obj={
                    name:'Jack',
                    age:29,
                    school:{
                      name:'Middle School',
                      age:'',
                      location:undefined
                    }
                }
                  var a = JSON.stringify(obj)
                  var b =JSON.parse(a,function(key,value){
                    if(key == 'age'){
                      return value+1
                    }else if(key == 'name'){
                      return undefined
                    }else{
                      return value
                    }
                  })
                  console.log(b)

因为当key值为name的时候,返回的undefined,所以返回的新对象里面name属性被删掉。

推荐阅读