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的转换就讲到这里了,打完收工
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的转换就讲到这里了,打完收工
相关文章推荐
- GUI - Web前端开发框架
- 使用 Python 处理 JSON 格式的数据
- XML 与 JSON 优劣对比
- 如何优雅地处理前端异常?
- VBA将excel数据表生成JSON文件
- newtonsoft.json解析天气数据出错解决方法
- vbs 解析json jsonp的方法
- Ruby和Ruby on Rails中解析JSON格式数据的实例教程
- Extjs4如何处理后台json数据中日期和时间
- C#实现将类的内容写成JSON格式字符串的方法
- JQuery ajax返回JSON时的处理方式 (三种方式)
- jquery JSON的解析方式示例介绍
- c#版json数据解析示例分享
- ASP JSON类文件的使用方法
- WEB前端开发都应知道的jquery小技巧及jquery三个简写
- C# JSON格式化转换辅助类 ConvertJson
- C#实现对Json字符串处理实例
- C#实现Json转Unicode的方法
- php解析json数据实例
- PHP中JSON的应用技巧