首页 > 代码库 > 小谈一下JavaScript中的JSON
小谈一下JavaScript中的JSON
一、JSON的语法可以表示以下三种类型的值:
1、简单值:字符串,数值,布尔值,null
比如:5,"你好",false,null
JSON中字符串必须用双引号,而JS中则没有强制规定。
2、对象
比如:
1 {2 "name":"蔡斌",3 "age":21,4 "isRich":false,5 "school":{6 "name":"广东工业大学",7 "location":"广州市大学城"8 }9 }
需要注意的是,属性值必须要加双引号。
3、数组
比如:
1 [23,"i",false];
或
1 [2 {3 "name":"蔡斌"4 },5 {6 "name":"张三"7 }8 ]
二、序列化与解析
1、将JS对象序列化成JSON对象 JSON.stringify():
比如:
1 var person = {2 name:"蔡斌",3 age:21,4 school:“广东工业大学”5 }6 7 var personJson = JSON.stringify(person);
结果如下:
1 {"name":"蔡斌","age":21,"school":"广东工业大学"}2 //typeof personJson;3 //String
注意:序列化JS对象时,所有函数(除了等下要说到的toJSON()方法以外),原型成员都会被忽略,所有值为undefined的属性也会被忽略。
例如:
1 var person = {2 name:"蔡斌",3 age:21,4 school:“广东工业大学”.5 phone:undefined,6 sayHi:function(){7 alert("hi, i am caibin");8 }9 }
1 console.log(JSON.stringify(person));
结果如下
1 {"name":"蔡斌","age":21,"school":"广东工业大学"}
序列化函数的参数,可以有另外两个可选的参数,这其中,第一个参数是过滤器,可以是一个数组,表示需要留下的属性,也可以是一个函数;第二个参数是一个选项,表示是否在JSON字符串中保留缩进,这个选项可以是数字,比如:3,也可以是字符串,但是数字最大只能为10,(超过10当做10),字符串长度最多为10(超过10当做10)。
比如:
当第一个参数是数组时,返回要保留的属性:
1 var caibinsname = JSON.stringify(person,["name"]);
结果:
{"name":"蔡斌"}
当第一个参数是一个函数时,它有两个参数key,value,分别对应JS对象的属性名和属性值
1 var caibin = JSON.stringify(person,function(key,value){ 2 switch(key){ 3 case "name": 4 return "caibin"; 5 case "age": 6 return value + 1; 7 case "school": 8 return value; 9 default:10 return value;11 }12 });
结果如下:
{"name":"caibin","age":22,"school":"广东工业大学"}
名字被改成了英文的,然后年龄也增加了1
接下来是可选参数的第二个参数
当第二个参数是数字时:
var caibinsname = JSON.stringify(person,["name","age"],4);
结果:其中每个属性前面缩进了4个空格
1 {2 "name": "蔡斌",3 "age": 214 }
再如:
1 var caibinsname = JSON.stringify(person,["name","age"],"**");
结果如下:
1 {2 **"name": "蔡斌",3 **"age": 214 }
第一个参数不用时,需要将其设置为null:
var caibinsname = JSON.stringify(person,null,4);
toJSON()方法:
当JSON.stringify()方法不能满足对某些对象的序列化要求时,可以给对象增加一个自定义的方法。
原生的Date对象有一个toJSON方法,可以将其转换成IS0 8601日期字符串(这和在Date对象上调用.toISOString()方法返回的结果一致)
比如:
1 var newDate = new Date();2 JSON.stringify(newDate);
结果如下:
"2014-07-29T16:11:27.340Z"
我们可以为任何对象添加toJSON方法:
1 var book = {2 title:"JavaScript权威指南",3 edition:6,4 toJSON:function(){5 return "《"+this.title + " 第六版》"6 }7 };8 JSON.stringify(book);
结果如下:
"《JavaScript权威指南 第六版》"
小结下:
假设把一个对象Object传递给JSON.stringify(),序列化Object的顺序如下:
a、如果存在toJSON()方法,则调用toJSON()方法,否则返回该对象本身。
b、如果可选的参数中,第一个参数是过滤器,则应用这个过滤器,并且将a中的返回值传递给这个过滤器
c、对于b中返回的每个值进行序列化
d、如果可选的参数中,第二个参数存在,那么执行相应的格式化操作。
2、将JSON字符串解析成JS对象
//personjson : {"name":"蔡斌","age":21,"school":"广东工业大学"}
1 var caibin = JSON.parse(personjson);
结果如下:
Object {name: "蔡斌", age: 21, school: "广东工业大学"}
typeof caibin;
//object
JSON.parse()方法也可以接收另一个参数,该参数是一个函数,将在每个键值对上调用。这个函数通常被称作还原函数。
比如:
1 var caibin = JSON.parse(personjson,function(key,value){2 if(key == "name"){3 return "caibin";4 }5 return value;6 });
结果如下:
Object{name: "caibin", age: 21, school: "广东工业大学"}
原来的"name":”蔡斌“ 已经被还原成 name:"caibin"
通常将日期字符串转换成Data对象时,要用到还原函数:
1 var book = { 2 "title":"JavaScript高级程序设计", 3 edition:3, 4 releaseDate:new Date(2011,11,1) 5 } 6 var bookJson = JSON.stringify(book); 7 8 var bookcopy = JSON.parse(bookJson,function(key,value){ 9 if(key == "releaseDate"){10 return new Date(value);11 }12 return value;13 });
结果bookcopy的值如下(chrome控制台打印):
Object {title: "JavaScript高级程序设计", edition: 3, releaseDate: Thu Dec 01 2011 00:00:00 GMT+0800 (中国标准时间)}
来自为知笔记(Wiz)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。