JSON
简单值
"Hello world!"
javascript字符串与JSON字符串的最大区别在于,JSON字符串必须使用双引号(单引号会导致语法错误).
JSON对象
1、js对象与json对象的区别
对象字面量
var person = { name:'Lucy', age;29 };
或
var person = { name:'Lucy', age;29 };
JSON
{ "name":"Lucy", "age":29 }
与JS的对象字面量相比,JSON对象有三个地方不一样
1)、没有声明变量(JSON中没有变量的概念)
2)、没有末尾的分号(因为这不是JavaScript语句,所以不需要分号)
3)、JSON对象的属性名任何时候都必须加双引号,忘了加双引号是常见都错误,这在JSON中是必需的,属性的值可以是简单值,也可以是复杂类型(对象等)
2、json对象有两个方法
stringify():把js对象序列化为json字符串
parse():json字符串解析为原生的js值。
sringify()
var book = { title:'professional javascript', authors:['Nicholas'], edition:3, year:2011 } var jsonText = JSON.stringify(book); //{"title":"professional javascript","authors":["Nicholas"],"edition":3,"year":2011}
把js对象序列化成一个json字符串,然后保存再jsonText中。默认情况下
1)、JSON.stringify()输出的JSON字符串不包含任何空格字符和缩进
2)、在序列化js对象时,所有函数及原型都会被有意忽略
3)、值为undefined的任何属性也都会被跳过。
var bookCopy = JSON.parse(jsonText);//{ title:"professional javascript",authors:['Nicholas'],edition:3,year:2011}
虽然bookCopy与book具有相同都属性,但它们是两个独立的,没有任何关系的对象
3、stringify()还可以接收第二个参数作为过滤器
第二个参数以数组点形式传入
var book = { title:'professional javascript', authors:['Nicholas'], edition:3, year:2011 } var jsonText = JSON.stringify(book,['title','edition']); console.log(jsonText); //{"title":"professional javascript","edition":3}
想改变value值,可以以函数的方式传入
var book = { title:'professional javascript', authors:['Nicholas'], edition:3, year:2011 } var jsonText = JSON.stringify(book,function(key,value){ switch(key){ case "authors": return value.join(","); case "year": return 5000; case "edition": return undefined; default: return value; } }); console.log(jsonText);//{"title":"professional javascript","authors":"Nicholas","year":5000}
其中键为edition,通过返回undefined删除改属性,返回undefined意味着要跳过某个属性
4、stringify()第三个参数表示缩进
第三个参数如果是数字
var book = { title:'professional javascript', authors:['Nicholas'], edition:3, year:2011 } var jsonText = JSON.stringify(book,['title','edition'], 4); console.log(jsonText); /* { "title": "professional javascript", "edition": 3 } */
第三个参数是4,表示每个级别缩进4个空格,只要传入有效的控制缩进的参数值,结果字符串就会包含换行符。(只缩进而不换行意义不大)。最大缩进空格数为10,
所有大于10的值都会自动转换为10.
缩进参数是字符串
var book = { title:'professional javascript', authors:['Nicholas'], edition:3, year:2011 } var jsonText = JSON.stringify(book,['title','edition'], '--'); console.log(jsonText); /* { --"title": "professional javascript", --"edition": 3 } */
同样,缩进字符串最长不能超过10个字符长。如果长度超过10个,结果将只出现前10个字符。
5、toJSON()方法
stringify()还是不能满足对某些对象进行自定义序列化对需求。在这些情况下,可以给对象定义toJSON()方法
var book = { title:'professional javascript', authors:['Nicholas'], edition:3, year:2011, toJSON:function(){ return this.title; } } var jsonText = JSON.stringify(book); console.log(jsonText);//"professional javascript"
toJSON可以作为函数过滤器的补充,因此理解序列化的内部顺序十分重要
1)如果存在toJSON()方法而且能通过它取得有效的值,则调用该方法。否则,返回对象本身。
2)如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第1步返回的值(意思就是第二个参数无效)
3)对第2步返回的每个值进行相应的序列化
4)如果提供第三个参数,执行相应的格式化
6、JSON.parse()方法也可以接收另一个函数,区别stringify()的替换函数(replacer),这个函数被称为还原函数
var book = { title:'professional javascript', authors:['Nicholas'], edition:3, year:2011, releaseDate:new Date(2011,11,1) } var jsonText = JSON.stringify(book); var bookCopy = JSON.parse(jsonText,function(key,value){ if(key == 'releaseDate'){ return new Date(value); }else{ return value } }) console.log(bookCopy);
JSON数组
数组字面量
var values = [25,'hi',true];
JSON数组
[25,"hi",true]
同样,js数组和json数组的区别
1)、没有声明变量(JSON中没有变量的概念)
2)、没有末尾的分号(因为这不是JavaScript语句,所以不需要分号)