什么是JSON
json 数据格式,不是编程语言。
很多编程语言都有针对json的解析器和序列化器
json是javascript语法的子级
xml 和json 比较
以前----------xml是互联网上传输结构化数据的实际标准
xml过于繁琐、囵余
与xml数据结构解析成dom文档摈弃去除数据麻烦
js 和 json区别
json字符串必须使用双引号(单引号报错)
json中的对象属性加双引号
json不能存放变量,没有声明、没有分号结尾
不能出现连个同名的属性(在同一个对象中)
undefined 不能作为json 对象
解析和序列化
JSON.stringify()/JSON.parse()
序列化为json字符串/解析成元素的js值
默认情况下JSON.stringify()输出的json字符串不不包括认可空空个字符串或者缩进(可通过json.stringify 的第三个参数修改)
在序列化对象时,所有函数和原型都会被有意忽略,值为undefined 的任何属性都会被跳过。
可以把json解析成javascript对象
JSON.stringify() 接收三个参数,后两个了省略
第二个参数是过滤器: 可以是数组或者函数
- 数组:将返回包含数组中列出的属性
let obj={name:'ren',age: 18,gender:1}
JSON.stringify(obj,['name','age'])//{"name":"ren","age":18} 少了gender
- 函数:接收两个参数(key,value)(起到拦截在操作的作用)
let obj={name:'ren',age: 18,gender:1}
JSON.stringify(obj,function(key,value){
switch(key) {
case 'name': return value +'ning';
case 'age' : return undefined
}
})//{"name":"ren","gender":1} 少了age 因为 json 序列化时默认会忽略 对象中的原型属性,函数和值为undefined 的属性
第三个参数是字符串换行:
- 当值为数值时: 表示每个级别缩进的空格数 最大为 10 超过的话 自动转换为 10
- 当值为字符串时:标识 以这个字符串进行缩进
JOSN.stringify(obj,null, '--')
#json
{
--"name": "ren",
--"age": 14,
--"gender": 1,
}
JSON.parse() 也有第二个参数 :
第二个参数 和 JSON.stringify()的第二个参数类似 为还原函数,
如: 直接把json 格式的时间戳转换成 日期 在返回
#json
{
--"time": 454351342143,
--"age": 14,
--"gender": 1,
}
JSON.parse(obj,function(key, value) {
if(key == 'time') {
return new Date(value)
}
})
eval()和 json()
早期的json解析器是eval()函数
旧版中使用eval()对json数据结构求职存在风险,可能会执行一些恶意代码
由于json是javascript语法的子级,因此eval()函数 可以解析,解释并且返回javascript 对象和数组
ECMAScript5对解析json的行为进行规范
定义了全局对象JSON
支持ie8+
小结:
json 是轻量级数据格式,简化表示复杂数据结构的工作量。xml能做到的 json也能做到,简单不繁琐
ECMAScript5定义了全局JSON对象,支持ie8+