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的转换就讲到这里了,打完收工