曾经一段时间,XML是互联网传递数据的统一标准,可是业界一直不乏质疑XML的人士,他们都认为XML过于繁琐,冗长;提取数据也过于麻烦javascript
2006年,JSON被提交给了IETF;在这以后,JSON逐渐发展起来,在互联网上获得普遍应用;java
咱们要记住:JSON只是一种数据格式,主要用来传递数据,并非一种编程语言,虽然与JavaScript的语法类似,可是并非JavaScript才使用JSON,毕竟JSON只是一种数据格式,不少编程语言都有针对JSON的解析器和序列化器编程
(1)基础语法:json
// 把JavaScript对象序列化成JSON字符串 var jsonText = JSON.stringify(book);
// 将JSON对象解析成原生JavaScript值 var js = JSON.parse(jsonText);
(2)JSON能够表示如下三种类型的数据:数组
简单值:能够在JSON里面表示 数值、字符串、布尔值、null;不支持 undefined编程语言
对象:复杂数据类型,保存一组键值对;在JSON里,对象的键必定要加双引号,值能够是简单值,也能够是复杂数据类型的值函数
数组:复杂数据类型,保存一组值;值能够是简单值,也能够是复杂数据类型的值this
JSON不支持变量,函数,对象实例等,它只是一种表示数据的格式,里面只用来存储数据,不会有逻辑、操做等代码在里面code
简单值,简单值中的字符串必须使用双引号,使用单引号报错对象
number、string、bool、null
对象,直接使用{ }符号,没有变量,括号后面不用加分号;同一个对象中不该该有相同的属性,如下两个location属性,分别属于不一样对象,这样是没有问题的;
{ "name": "过青年", "age": 20, "arr": [1,2,3,4], "location": "江西宜春", "school": { "location": "江西南昌" } }
数组,直接使用[ ]符号,里面简单值和复杂数据类型能够组合使用,构成更复杂的数据集合;
[ 20, { "name": "过青年", "age": 20 }, [1,2,3], "过青年" ]
对象和数组通常是JSON数据最外层的结构,利用它们能够创造出各类各样的数据集合
(1)过滤结果
JSON.stringify(js对象,过滤器参数)
方法能够传递两个参数
若是过滤器参数是数组,那么JSON.stringify( )的结果将只包含数组中列出的属性
var obj = { name: "过青年", age: 20, arr: [1,2,3,4], location: "江西宜春", school: { location: "江西南昌" } } console.log(JSON.stringify(obj,["name","age","arr"])); // {"name":"过青年","age":20,"arr":[1,2,3,4]}
若是过滤器参数是函数(过滤函数),能够改变序列化对象的结果;函数第一个参数默认是属性名(键),第二个参数默认是属性值
若是返回的是undefined
,则相应的属性名和属性值会被忽略
var jsonText = JSON.stringify(obj,function(key,value){ switch (key) { case "name": return 20; case "age": return "过青年"; case "arr": return [4,3,2,1]; case "school": return undefined; default: return value; } }); console.log(jsonText); // {"name":20,"age":"过青年","arr":[4,3,2,1],"location":"江西宜春"}
(2)格式化:字符串缩进、空白符
第三个参数控制缩进和空白符;
var jsonText = JSON.stringify(obj,null,4); console.log(jsonText); /* { "name": "过青年", "age": 20, "arr": [ 1, 2, 3, 4 ], "location": "江西宜春", "school": { "location": "江西南昌" } } */
var jsonText = JSON.stringify(obj,null,"-"); console.log(jsonText); /* { -"name": "过青年", -"age": 20, -"arr": [ --1, --2, --3, --4 -], -"location": "江西宜春", -"school": { --"location": "江西南昌" -} } */
(3)toJSON
方法
咱们能够在须要序列化的对象上增长一个toJSON
方法,这样当使用JSON.stringify()方法时,实际上就是调用了对象中的toJSON()方法
var obj = { name: "过青年", age: 20, arr: [1,2,3,4], location: "江西宜春", school: { location: "江西南昌" }, toJSON:function(){ return this.name; } } var jsonText = JSON.stringify(obj); console.log(jsonText); // 过青年
(4)把一个对象传入JSON.stringify()中,序列化该对象的顺序以下:
<1> 若是该对象中有toJSON方法,则直接调用该方法;
<2> 若是JSON.stringify()中有第二个参数,则应用过滤器,过滤器接受的值就是<1>中返回的值
<3> 过滤器处理<1>中返回的值
<4> 若是有第三个参数,执行相应的格式化
var obj = { name: "过青年", age: 20, arr: [1,2,3,4], location: "江西宜春", school: { "location": "江西南昌" }, toJSON:function(){ name = this.name; age = this.age; return {name,age}; } } var jsonText = JSON.stringify(obj,function(key,value){ if(key === "name") { return "哈哈哈"; }else{ return value; } }); console.log(jsonText); // {"name":"哈哈哈","age":20}
理解序列化对象的过程仍是很重要的
JSON.parse()方法也有两个参数,第二个参数是一个函数,叫作还原函数
var obj = { name: "过青年", age: 20, arr: [1,2,3,4], location: "江西宜春", school: { "location": "江西南昌" } }; var jsonText = JSON.stringify(obj); var jsText = JSON.parse(jsonText,function(key,value){ if (key === "name") { return "哈哈哈哈"; } else { return value; } }); console.log(jsText); //{name: '哈哈哈哈', age: 20, arr: Array(4), location: '江西宜春', school: {…}}
JSON.stringify()
用于序列化,JSON.parse()
用于解析JSON.stringify()
有三个参数,第一个是js对象,第二个是过滤器,第三个是用来格式化JSON输出JSON.parse()
有两个参数,第一个参数是JSON对象,第二个参数是还原函数toJSON
方法,当JSON.stringify()
方法调用时,自动执行toJSON
方法JSON.stringify()
方法的返回值都是字符串类型