json => javascript object notation
什么是json
数据交换的文本格式,简单说,每个Json对象,就是一个值,要么是简单类型的值,要么是复合类型的值,但是只能是一个值,不能是两个或更多的值,这就是说,每个Json文档只能包含一个值。
(ie7及以下浏览器不支持json,只需要去http://json.org下载对应文件就行)。
json的优点
书写简单,一目了然,符合javascript原生语法,可以由解释引擎直接处理,不用另外添加解析代码。
json数据类型和格式规定
· 复合类型的值只能是数组或对象,不能是函数、正则表达式对象,日期对象。
· 简单类型的值只有四种:字符串、数值(必须以十进制表示)、布尔值和null(不能使用NaN,Infinity,-Infinity,undefined)。
· 字符串必须使用双引号表示,不能使用单引号 ["one","two","three"]
· 对象的键名必须放在双引号里面 {"one":1,"two":2,"three":3} {"names":["张三","李四"]}
· 数组或对象最后一个成员的后面,不能加逗号 [{"name":"张三"},{"name":"李四"}]
Json的两个方法( JSON.stringify() 和 JSON.parse() )
JSON.stringify()用于将一个值转为字符串。该字符串应该符合JSON格式,并且可以被JSON.parse()方法还原。
例1:
JSON.stringify('abc'); // ""abc"" JSON.stringify(1); // "1" JSON.stringify(false); // "false"
JSON.stringify() 的第二个参数(可以是函数,用来更改JSON.stringify的默认行为),指定需要转成字符串的属性
var obj = { 'prop1':'value1', 'prop2':'value2', 'prop3':'value3' } var selectedProperties = ['prop1','prop2']; JSON.stringify(obj,selectedProperities); // "{"prop1":"value1","prop2":"value2"}"
JSON.stringify(['a','b'],['0']); // "["a","b"]" 对数组无效,只对对象有效 JSON.stringify({0:'a',1:'b'},['0']); // "{"0","a"}"
function f(key,value){ if(typeof value === "number"){ value = 2 * value; } return value; } JSON.stringify({a:1,b:2},f); // "{"a":2,"b":4}"
JSON.stringify 的第三个参数,用于增加返回的JSON字符串的可读性。如果是数字,表示每个属性前面添加的空格(最多不超过10个);如果是字符串(不超过10个字符),则该字符串会添加在每行前面。
JSON.stringify({p1:1,p2:2},null,'|--'); //{ |--"p1":1, |--"p2":2 }
toJSON方法
如果JSON.stringify的参数对象有自定义的toJSON方法,那么JSON.stringify会使用这个方法的返回值作为参数,而忽略原对象的其他属性。
var user = { firstName:'三', lastName:'张', get fullName(){ return this.lastName + this.firstName; }, toJson:function(){ var data = { firstName:this.firstName, lastName:this.lastName }; return data; } }; JSON.stringify(user); // "{"firstName":"三","lastName":"张"}"
toJSON方法可以将正则对象自动转为字符串。因为JSON.stringify默认不能转换正则对象,但是设置了toJSON方法以后,就可以转换正则对象了。
var obj = { reg : /foo/ } //设置 toJSON方法 RegExp.prototype.toJSON = RegExp.prototype.toString; JSON.stringify(/foo/) ; // ""/foo/""
JSON.parse()方法,用于将JSON字符串转化成对象。
JSON.parse('{}'); //{} JSON.parse('true'); // true JSON.parse('"foo"'); // "foo" JSON.parse('[1,5,"false"]'); // [1,5,"false"] JSON.parse('null') //null var o = JSON.parse('{"name":"张三"}'); o.name //张三
JSON.parse方法可以接受一个处理函数,用法与JSON.stringify方法类似。 function f(key,value){ if(key === ''){ return value; } if(key === 'a'){ return value + 10; } } var o = JSON.parse('{"a":1,"b":2}',f); o.a // 11 o.b //undefined