JSON入门详解.docx

上传人:b****6 文档编号:7445375 上传时间:2023-01-24 格式:DOCX 页数:12 大小:370.35KB
下载 相关 举报
JSON入门详解.docx_第1页
第1页 / 共12页
JSON入门详解.docx_第2页
第2页 / 共12页
JSON入门详解.docx_第3页
第3页 / 共12页
JSON入门详解.docx_第4页
第4页 / 共12页
JSON入门详解.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

JSON入门详解.docx

《JSON入门详解.docx》由会员分享,可在线阅读,更多相关《JSON入门详解.docx(12页珍藏版)》请在冰豆网上搜索。

JSON入门详解.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 预防医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1