JSON入门详解.docx
《JSON入门详解.docx》由会员分享,可在线阅读,更多相关《JSON入门详解.docx(12页珍藏版)》请在冰豆网上搜索。
JSON入门详解
JSON入门
快速浏览JSON与XML表现形式
假如有一个employee对象,它有“姓、名、员工编号、头衔”等信息,先看看JSON是如何来描述它的:
再来看看XML是如何表示的,请看:
从上面描述看,JSON表示法不正是JavaScript中对象描述的一种方式么?
正确,这正是JavaScript中的对象构造的原生代码。
既然是原生代码,我们把它转换成JavaScript中的对象,这样我们操作对象就比操作字符串方便多了。
把JSON字符串转换成JavaScript对象:
JSON优缺点
优点:
乍看上去,使用JSON的数据分隔符的优点可能并不那么明显,但存在一个根本性的缘由:
它们简化了数据访问。
使用这些数据分隔符时,JavaScript引擎对数据结构(如字符串、数组、对象)的内部表示恰好与这些符号相同。
JSON的另一个优点是它的非冗长性。
在XML中,打开和关闭标记是必需的,这样才能满足标记的依从性;而在JSON中,所有这些要求只需通过一个简单的括号即可满足。
在包含有数以百计字段的数据交换中,传统的XML标记将会延长数据交换时间
此外,JSON受到了擅长不同编程语言的开发人员的青睐。
这是因为无论在Haskell中或Lisp中,还是在更为主流的C#和Java中,开发都可以方便地生成JSON。
不足:
和许多好东西都具有两面性一样,JSON的非冗长性也不例外,为此JSON丢失了XML具有的一些特性。
命名空间允许不同上下文中的相同的信息段彼此混合,然而,显然在JSON中已经找不到了命名空间。
JSON与XML的另一个差别是属性的差异,由于JSON采用冒号赋值,这将导致当XML转化为JSON时,在标识符(XMLCDATA)与实际属性值之间很难区分谁应该被当作文本考虑。
另外,JSON片段的创建和验证过程比一般的XML稍显复杂。
从这一点来看,XML在开发工具方面领先于JSON。
JSON实践
预备知识
动态脚本函数eval()
eval()函数可计算某个字符串,并执行其中的的JavaScript代码。
它接收一个参数s,如果s不是字符串,则直接返回s。
否则执行s语句。
如果s语句执行结果是一个值,则直接返回此值,否则返回undefined。
另外,该方法只接受原始字符串作为参数,如果string参数不是原始字符串,那么该方法将不作任何改变地返回。
因此请不要为eval()函数传递String对象来作为参数:
最后,需要特别注意的是对象声明语法“{}”并不能返回一个值,需要用括号括起来才会返回值(括号里的脚本是表达式,有返回值,而不是无返回值的逻辑式,因为大括号里的脚本又可能是表达式,又可能是普通的逻辑表达,所以用小括号括起来后明确的说明是值表达式):
可以看到,对于对象声明语句来说,仅仅是执行,并不能返回值。
为了返回常用的“{}”这样的对象声明语句,必须用括号括住,以将其转换为表达式,才能返回其值。
这也是使用JSON来进行Ajax开发的基本原理之一。
现来说说本节的重点,就是在应用eval时,动态脚本所生成的变量都局部的,但很多时候我们可能在调用eval函数的外面使用生成的变量,eval不可能在全局空间内执行,这就给开发带来了不少问题,这该如何作?
请看继续往下看吧。
我们先来证实一下eval产生的变量是局部性的,在调用eval函数外是不能访问到此变量的。
另外,eval生成的函数也是局部的,它只能在生成它的函数内使用,出函数域就不能调用的到。
现解释一下:
1、对于IE浏览器,默认已经提供了这样的函数:
execScript,用于在全局空间执行代码。
2、对于Firefox浏览器,直接调用eval函数,则在调用者的空间执行;如果调用window.eval则在全局空间执行。
JavaScript中的JSON
我们知道,可以使用eval()方法调用JavaScript的编译器把JSON文本转变成对象。
因为JSON是JavaScript的一个确切的子集,编译器可以正确地解析JSON文本,然后生成一个对象结构。
eval函数非常快速。
它可以编译执行任何JavaScript程序,因此产生了安全性问题。
当使用可信任与完善的源代码时才可以使用eval函数。
这样可以更安全的使用JSON解析器。
使用XMLHttpRequest的web应用,页面之间的通讯只允许同源,因此是可以信任的。
但这却不是完善的。
如果服务器没有严谨的JSON编码,或者没有严格的输入验证,那么可能传送包括危险脚本的无效JSON文本。
eval函数将执行恶意的脚本。
如果关心安全的话,使用JSON解析器可以防止此类事件。
JSON解析器只能辨识JSON文本,拒绝所有脚本,因此它比较安全,JSON官方网站提供的一个开源的JSON解析器和字符串转换器(http:
//www.json.org/json.js)。
而JSON的字符串转换器(stringifier)则作相反的工作,它将JavaScript数据结构转换为JSON文本。
JSON是不支持循环数据结构的,所以注意不能把循环的结构交给字符串转换器。
Java中的JSON
Java中的JSON解释器官方提供了好几种,我们这里使用的是org.json包,关于如何使用,请参见另一篇《JSON之org.json包测试》,它是基于官方包提供的测试改写而来的。
开始实战
本实例实现了客户端与服务器端通过JSON进行参数的传递与接收,而不是通过原来的XML方式进行通信。
页面采用了Prototype的Ajax方式进行异步通信,并采用了官方json.js进行对象与JSON串的灵活互转。
服务器端采用了官方提供org.json包进行JSON串与Java对象的互转。
具体的细节请看代码注释。
客户端实现:
页面展示结果:
JSONAddressBook
服务器返回的JSON串如下:
{"addressbook":
[
{
"address":
{
"city":
[
"Seattle,WA",
"changsha"
],
"street":
["P.OBOX54534"],
"zip":
[42452]
},
"name":
"AnnMichaels",
"phoneNumbers":
[
"561-832-3180",
"531-133-9098"
]
},
{
"address":
{
"city":
[
"Miami,FL",
"changsha"
],
"street":
["53MullholandDrive"],
"zip":
[72452]
},
"name":
"BettyCarter",
"phoneNumbers":
[
"541-322-1723",
"546-338-1100"
]
}
]}
从JSON对象提取信息如下:
Name:
AnnMichaels
Address:
P.OBOX54534--Seattle,WA,42452.
Telephonenumbers:
561-832-3180&531-133-9098.
Name:
BettyCarter
Address:
53MullholandDrive--Miami,FL,72452.
Telephonenumbers:
541-322-1723&546-338-1100.
服务器端实现:
服务器后台打印:
{"addressbook":
[
{
"address":
{
"city":
[
"Seattle,WA",
"changsha"
],
"street":
["P.OBOX54534"],
"zip":
[42452]
},
"name":
"AnnMichaels",
"phoneNumbers":
[
"561-832-3180",
"531-133-9098"
]
},
{
"address":
{
"city":
[
"Miami,FL",
"changsha"
],
"street":
["53MullholandDrive"],
"zip":
[72452]
},
"name":
"BettyCarter",
"phoneNumbers":
[
"541-322-1723",
"546-338-1100"
]
}
]}
-----------------------------------------------
接收到客户端的JSON信息如下:
{"addressbook":
[
{
"address":
{
"city":
"Seattle,WA",
"street":
"P.OBOX54534",
"zip":
42452
},
"name":
"AnnMichaels",
"phoneNumbers":
[
"561-832-3180",
"531-133-9098"
]
},
{
"address":
{
"city":
"Miami,FL",
"street":
"53MullholandDrive",
"zip":
72452
},
"name":
"BettyCarter",
"phoneNumbers":
[
"541-322-1723",
"546-338-1100"
]
}
]}
The1addressbookmsg:
address-------
Seattle,WA
P.OBOX54534
42452
name----------
AnnMichaels
phoneNumbers--
561-832-3180
531-133-9098
The2addressbookmsg:
address-------
Miami,FL
53MullholandDrive
72452
name----------
BettyCarter
phoneNumbers--
541-322-1723
546-338-1100