JSON的使用・小结
JSON--JavaScript Object Notation (JavaScript对象表示法)
初始JSON的人很容易弄混对象与JSON(我也是刚刚弄清楚 ⊙﹏⊙)。
JSON是一种数据格式,经常有人说什么"把数据变成JSON对象然后@#¥……@¥"。
对象不一定是JSON格式,而JSON格式的数据(以下简称JSON数据)则一定是对象(简单的数据,如1,"ABCD"都算是JSON格式,这里暂且忽略之)
JSON格式是以key-value的形式存放数据的 如:
{ "name":"Rose", "age":25, "family":{ "brother":"Who" } }
这当中value可以是数字,字符串,数组,甚至null,但不能为undefined,function,对象实例和变量,否则该属性会被无视掉。例:
var p = { "name":"Rose", "family":undefined, "age":25, "sex":function(){} } JSON.stringify(p);//-->'{"name":"Rose","age":25}' //这里的JSON.stringify是EcmaScript5提供的,JSON是一个处理JSON数据的对象(IE8+ & 其他主流浏览器)。
JSON对象有两个方法parse()和stringify();
①JSON.parse(str)是将字符串str转换成JSON数据.如
JSON.parse('{"name":"Ray","age":18}')-->{"name":"Ray","age":18}
②JSON.stringify(json,arg2)将JSON数据序列化。
第一个参数json是JSON数据;
第二个参数是可选的,字符串数组或者函数。如果是数组的话则是只保留key值在数组中存在的属性;函数的话,则可以对灵活的对value进行修改。例:
var json = {"name":"Ray","age":18,"friends":{"id":32,favorite:"TokyoHot"}} JSON.stringify(json,["age","id"]);//这个key仅限于第一层属性,所以"id"会被无视 -->'{"age":18}' var json = {"name":"Ray","age":18} JSON.stringify(json,function(key,value){ switch(key){ case "name":return value.length;break; case "age":return +value + 10;break; default:return value; } }); -->'{"name":3,"age":28}'
③小拓展
通过JSON对象实现对象的深复制(因为使用了JSON对象的stringify方法,所以是有局限性的,对象中不能包含函数和对象实例)
var a = {A:4}; var b = JSON.parse(JSON.stringify(a));
字符串向JSON格式转换的过程中,字符串里不能包含某些具有特殊含义的字符,否则会转换失败.例
var str = '{"name":"NothingGo\sRight"}'; JSON.parse(str);//这里会报错。如果是用jQuery的Ajax获取JSON的话,情况相同。
blacklist整理入下:
\0,\b,\n,\f,\r,
\t,\v,\u,\v,\x
通过使用eval转换JSON格式数据的问题
因为JSON对象在低版本浏览器的普及度低,我们在将序列化的数据向JSON格式转换时没有用JSON对象,而是用eval和Function(这里就不讲它了)。
eval的使用方法
var str = '{"Name":"Ray"}'; var json = eval("(" + str + ")");
这里的问题所在就是,初学者很容易就写成如下格式
var json = eval(str);
结果就报出了令人疑惑的错误:SyntaxError: Unexpected token :
疑惑是因为左看右看str都是正确的格式啊,而冒号也没有问题。
其实真正的原因是使用者没有了解eval的执行机制。
简单的说eval就相当于直接把eval中的字符串当成javascript语句执行,再把返回值赋给前面的变量。
在js中括号括起来的部分会被强行变成表达式。即
var json = {"Name":"Ray"}
而大括号(最外层的)则被理解成包裹代码块的符号。也就是说只会执行大括号里面的内容。
这就成了 var json = "Name":"Ray";毫无疑问那个冒号会引起法错误。