JSON官方网站: http://json.org/
RFC中规定的JSON语法: http://www.ietf.org/rfc/rfc4627
1,JSON是什么
JSON是javascript对象的一种简单紧凑的标签。使用JSON表示法时,对象可以方便的转换成字符串来进行存储和转换(比如在不同程序或网络之间)。
然而,JSON的真正优雅之处在于对象在JSON中是以普通javascript代码表示的,因此我们可以利用javascript的"自动"解析功能,让javascript把JSON中的字符串你内容解释为代码,而不需要其他的解析程序或转换器。
JSON语法
JSON数据的表示方法是一系列成对的参数与值,参数与值由冒号分隔,每对之间以逗号分隔:
"param1":"value1","param2":"value2","param3":"value3"
最终这些序列用花括号包围起来,构成表示数据的JSON对象:
var jsonObject = {
"param1":"value1",
"param2":"value2",
"param3":"value3"
}
对象jsonObject的定义使用标准javascript表示法的子集,这只是有效的javascript代码的一小部分。
使用JSON表示法编写的对象也具有属性和方法,能够利用句号表示法进行访问:
alert(jsonObject.param1); //显示'value1'
更好的是,JSON是一种以字符串格式实现数据交换的通用语法。不仅仅是对象,任何能够以一系列"参数":"值"对表示的数据,都能够用JSON表示法莱表示。使用前面提到的"序列化"过程可以方便地把JSON对象转换为字符串,而序列化的数据便于在网络环境中进行存储和传输。
#作为一种通用的数据交换语法,JSON的用途有些类似于XML,但它更易于阅读和理解。另外,大型XML文件的解析过程比较慢,而JSON提供的是javascript对象,随时可以使用。
2,访问JSON数据
为了还原以JSON字符串编码的数据,需要把字符串转换为javascript代码,这通常称为字符串的"去序列化"
(1)使用eval()
直到现在,才有一些浏览器能够直接支持JSON。但是由于JSON是javascript的一个子集,我们可以使用javascript的函数eval()把JSON字符串转换为javascript对象。
javascript中的eval()函数会计算或运行作为参数传递的内容。如果参数是一个表达式,eval()会计算它的值,比如:
var x = eval(4*3); // x=12
如果参数包含一个或多个javascript语句,eval()执行这些语句:
eval("a=1;b=2;document.write(a+b);"); //向页面写入3
eval()函数使用javascript解释程序解析JSON文本生成javascript对象:
var myObject = eval('(' + jsonObjectString + ')');
然后就可以在脚本里使用这个javascript对象:
var user ='{"username":"xiaobaicai","age":13,"sex":"male",}'
var myObject = eval('(' +user+ ')');
alert(myObject.username)
(2)使用浏览器对JSON直接支持
最新的浏览器都对JSON提供直接支持,从而可以不使用eval()函数
浏览器会创建一个名为JSON的javascript对象来管理JSON的编码和解码。这个对象有两个方法:stringify()和parse()
JSON.parse()
JSON.parse()方法用于解释JSON字符串。它接收一个字符串作为参数,解析它,创建一个对象,并且根据字符串中找到的"参数":"值"对设置对象的参数:
var Mary = '{"height":1.9,"age":36,"eyeColor":"brown"}';
var myObject = JSON.parse(Mary);
var out = "";
for(i in myObject){
out += i + "=" + myObject[i] + "\n";
}
alert(out);
(3)在其他编程语言中使用JSON
以python为例,在python中提供了2个操作json数据的函数:json.load(),json.dump()。
json.load():用于对json数据的导入。和浏览器中JSON.parse()函数使用效果一样
json.dump():用于对json数据的打包。和浏览器中JSON.stringifg()函数使用效果一样
3,JSON的数据序列化
在数据存储和转换时,“序列化”是指把数据转换为便于通过网络进行存储和传输的形式,稍后再恢复为原始的格式。
JSON选择字符串作为序列化数据的格式。因此,为了把JSON对象进行序列化(比如为了通过网络连接进行传输),需要用字符串的形式来表示它。
在直接支持JSON的浏览器里,我们只需要简单地使用JSON.stringify()方法。
JSON.stringify()
利用JSON.stringify()方法可以创建对象的JSON编码字符串。
//先创建一个简单的对象,添加一些属性
var Dan = new Object()
Dan.name = "xiaobaicai";
Dan.age = 21;
Dan.sex = "male";
//然后使用JSON.stringify()方法序列化这个对象
JSON.stringify(Dan)
4,使用JSON创建对象
JSON提供的是一种对对象序列化的方法,所以使用JSON序列化后的对象仍具有一般对象具有的属性,如属性,方法,等
5,JSON安全性
使用JavaScript的eval()函数能够执行任何javascript命令,这可能会导致潜在的安全问题,特别是处理来源不明的JSON数据时。
更安全的方法是使用内置JSON解析器的浏览器把JSON字符串转换为javascript对象,它只识别JSON文本,而且不会执行脚本命令。同时内置的JSON解析器的速度也比eval()快一些。