您的位置:首页 > Web前端 > JavaScript

json和js字面量对象对比以及json序列号和反序列化的技术细节

2016-05-23 12:02 591 查看
json是一种数据格式,和js的字面量对象很像,但是还是有一点差别的

1.json对象顶级外层一般是对象或者数组,也可以是字符串,等基本类型变量,但是不可以是undefined,键值对的值也不可以是undefined

2.json对象是键值对的键必须要有双引号,不可以是单引号更不可以么有引号,而在js对象中可以,而且在json结尾不能有分号,而js对象有

在js中提供了一个JSON对象来实现json和js对象之间的转换:

js对象=》json:

稍微有点常识的前端开发人员都会立马想到:JSON.stringify(obj);这个方法来把js对象转换成json,这个大家都知道,其实这个方法有三个参数,现在就来说说细节问题:

1.第一个参数是要转换的对象,必须的,这个没什么好讲的了

2.第二个参数如果是数组,就起到白名单的作用,只有数组里面包含的键名才回被转换成对应的json字符串:

例如:

var json={

  name:'json',

  xiaoming:{

   name:'xiaoming',

      age:22

  },

  age:1,

 wadges:10000

}

var jsonText=JSON.stringify(json,['name','wadges']);// jsonText="{"name":"json","wadges":10000}"  ===>因为xiaoming这个键没有在数组里面,所以序列号成json的时候这个键值对就会被忽略

3.如果第二个参数是一个函数,这个函数有两个参数,分别是要序列化对象的键名和对应的值,可以对其进行修改然后再序列号

例如:

var jsonText=JSON.stringify(json,function(key,value){  //对象的每一个层级的每一个键值对都会传入这个函数进行过滤

if(key=='name'){

return 'change_'+value;//return回去的值就是序列号后json对应键值对的值,如果return  undefined的话会直接被忽略,不会序列化,相当于黑名单

}else{

return value;

}

});

jsonText="{"name":"change_json","xiaoming":{"name":"change_xiaoming","age":22},"age":1,"wadges":10000}";      //每个键值对都会执行这个函数

4.stringify方法的第三个函数是用来格式化序列化后的json的,默认是没有空格的

vart jsontext=JSON.stringify(json,null,4);//没个键值对前面保留四个空格,最多可以十个,如果第三个是字符串的话就会在每个键值对前面插入该字符串

"{

    "name": "json",

    "xiaoming": {

        "name": "xiaoming",

        "age": 22

    },

    "age": 1,

    "wadges": 10000

}"

讲完序列号后再扯扯json转js对象

方法:json=JSON.parse();

第一个参数是json字符串

第二个参数可以是一个函数,每个键值对会传入这个函数进行过滤,和stringify方法的第二个参数一样

讲完最后一个细节,toJSON()方法

如果一个对象含有toJSON(),那么序列号称json的时候回直接用toJSON()return的对象替换当前对象,然后再序列化称json

var obj={

name:'zhangshan',

age:'22',

toJSON:function(){

return 'repeat'

}

}

JSON.stringify(obj);  //  "repeat"  因为toJSON()的返回值直接替换当前的对象进行序列化,也就是说当前toJSON()return的对象优先级最高,如果存在直接序列化该对象

如果toJSON()没有返回值,这个时候序列化得到的事undefined

toJSON()必须是这样写,toJson,tojson这样写都不会起作用

关于js对象和json的转换就讲到这里了,打完收工
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  json 前端开发