JSON入门详解 json

| 法国移民 |

【www.guakaob.com--法国移民】

篇一:《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时,在标识符(XML CDATA)与实际属性值之间很难区分谁应该被当作文本考虑。

另外,JSON片段的创建和验证过程比一般的XML稍显复杂。从这一点来看,XML在开发工具方面领先于JSON。

JSON实践

预备知识

动态脚本函数eval ()

eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。它接收一个参数s,如果s不是字符串,则直接返回s。否则执行s语句。如果s语句执行结果是一个值,则直接返回此值,否则返回undefined。

另外,该方法只接受原始字符串作为参数,如果 string 参数不是原始字符串,那么该方法将不作任何改变地返回。因此请不要为 eval() 函数传递 String 对象来作为参数:

最后,需要特别注意的是对象声明语法“{}”并不能返回一个值,需要用括号括起来才会返回值(括号里的脚本是表达式,有返回值,而不是无返回值的逻辑式,因为大括号里的脚本又可能是表达式,又可能是普通的逻辑表达,所以用小括号括起来后明确的说明是值表达式):

这样的对象声明语句,必须用括号括住,以将其转换为表达式,才能返回其值 。这也是使用JSON来进行Ajax开发的基本原理之一。

现来说说本节的重点,就是在应用eval时,,但很多时候我们可能在调用eval函数的外面使用生成的变量,eval不可能在全局空间内执行,这就给开发带来了不少问题,这该如何作?请看继续往下看吧。

我们先来证实一下eval产生的变量是局部性的,在调用eval函数外是不能访问到此变量的。json

另外,eval生成的函数也是局部的,它只能在生成它的函数内使用,出函数域就不能调用的到。

json

现解释一下:

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解析器和字符串转换器()。

而JSON的字符串转换器(stringifier)则作相反的工作,它将JavaScript数据结构转换为JSON文本。JSON是不支持循环数据结构的,所以注意不能把循环的结构交给字符串转换器。

Java中的JSON

Java中的JSON解释器官方提供了好几种,我们这里使用的是 包,关于如何使用,请参见另一篇《JSON之org.json包测试》 ,它是基于官方包提供的测试改写而来的。

开始实战

本实例实现了客户端与服务器端通过JSON进行参数的传递与接收,而不是通过原来的XML方式进行通信。页面采用了Prototype的Ajax方式进行异步通信,并采用了官方 进行对象与JSON串的灵活互转。服务器端采用了官方提供 包进行JSON串与Java对象的互转。具体的细节请看代码注释。

客户端实现:

篇二:《JSON是什么》

JSON是什么

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。

JSON建构于两种结构:json

“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。

值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。 这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。 JSON具有以下这些形式:

对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。

数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。

值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。

字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。

字符串(string)与C或者Java的字符串非常相似。

数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。

空白可以加入到任何符号之间。

篇三:《json》

2010-04-22 22:02

JSON

JSON

再会吧,这宝贵的片刻和短暂的时机限制了我在情义上的真挚表示,也不能容我们畅舒衷曲,这本来是亲友久违重逢所应有的机缘;愿上帝赐给我们美好的将来,好让我们开怀畅谈!再一次告别;勇敢作战吧,祝你胜利!

————威廉·莎士比亚,《理查三世(The Tragedy of Richard the Third)》

JavaScript对象表示法(JavaScript Object Notation,简称JSON)是一种轻量级的数据交换格

式。它基于JavaScript的对象字面量表示法,那是JavaScript最精华的部分之一。尽管只是 JavaScript的一个子集,但它与语言武官。它可以被用于在所有以现代编程语言编写的程序 之间交换数据。它是一种文本格式,所以可以被人和机器阅读。它易于实现且易于使用。

1、JSON语法

JSON有6种类型的值:对象、数组、字符串、数字、布尔值(true和false)和特殊值

null。空白(空格符、制表符、回车符和换行符)可被插到任何值的前后。这可以使的JSON 文本更容易被人阅读。为了减少传输和存储的成本,空白可以被省略。

JSON对象是一个容纳“名/值”对的无序集合。名字可以是任何字符串。值可以是任何类 型的JSON值,包括数组和对象。JSON对象可以被无限层地嵌套,但一般来说保持其结构 的相对扁平是最高效的。大多数语言都有容易被映射为JSON对象的数据类型,比如对象 (object)、结构(struct)、字典(dictionary)、哈西表(hash table)、属性列表(prototype list)

或关联数组(associative array)。

JSON数组是一个值的有序序列。其值可以是任何类型的JSON值,包括数组和对象。大多 数语言都有容易被映射为JSON数组的数据类型,比如数组(array)、向量(vector)、列表 (list)或序列(sequence)。

JSON字符串要被包围在一对双引号之间。\字符被用于转义。JSON允许/字符被转义,所 以JSON可以被嵌入HTML的<script>标签中。除非用</script>标签初始化,否则HTML 不允许使用

JSON数字与JavaScript的数字相似。整数的首位不允许为0,因为一些语言用它来标示八 进制。这种基数的混乱在数据交换格式中是不可取的。数字可以是整数、实数或科学计数。 就是这样。这就是JSON的全部。JSON的设计目标是成为一个极简的轻便的和文本式的 JavaScript子集。实现互通所需要的共识越少,互通就越容易实现。

[json

{

"first":"Jerome",

"middle":"Lester",

"last":"Howard",

"nick-name":"Curly",

"born":1903,

"died":1952,

"quote":"nyuk-nyuk-nyuk!"

},

{

"first":"Harry",

"middle":"Moses",

"last":"Howard",

"nick-name":"Moe",

"born":1897,

"died":1975,

"quote":"Why,you!"

},

{

"first":"Louis",

"last":"Feinberg",

"nick-name":"Larry",

"born":1902,

"died":1975,

"quote":"I'm sorry.Moe,it was an accident!"

}

]

2、安全地使用JSON

JSON特别易于用在Web应用中,因为JSON就是JavaScript。使用eval函数可以把一段 JSON文本转化成一个有用的数据结构:

var myData=eval('('+myJSONText+')');

(用圆括号把JSON文本括起来是一种避免JavaScript语法中的歧义(译注1)的变通方案。) ———————————————————————————————

译注1: 在JavaScript的语法中,表达式语句(Expression Statement)不允许以花括号“{”开

始,因为那会与块语句(Block Statements)产生混淆。在使用eval()解析JSON文本时,为了

解决此问题,可以将JSON文本套上一对圆括号。圆括号在此处作为表达式的分组运算

符,能对包围在其中的表达式进行求值。它能正确地识别对象字面量。

然而,eval函数有着骇人的安全问题。用eval去解析JSON文本安全吗?目前,在Web 浏览器中从服务器端获取数据的最佳技术是XMLHttpRequest。XMLHttpRequest只能从生成

HTML的同意服务器获取数据。使用eval解析来自那个服务器的文本安全性和解析最初 HTML的安全性一样低。那是假定该服务器存有恶意的前提下,但如果它只是存在漏洞呢? 有漏洞的服务器或许并不能正确地对JSON进行编码。如果它通过拼凑一些字符串而不是使 用一个合适的JSON编码器来创建JSON文本,那么它可能在无意间发送危险的数据。如果 它充当的是代理的角色,并且尚未确定JSON文本是否格式良好就简单地传递它,那么它可 能再次发送了危险数据。

通过使用JSON.parse(译注2)方法替代eval就能避

免这种危险。如果文本中包含任何危险数据,那么JSON.parse将抛出一个异常。为了防止

服务器出现漏洞的状况,我推荐你总是用JSON.parse替代eval。即使有一天浏览器提 供了连到其他服务器的安全数据访问,使用它同样是个好习惯。

——————————————————————————————

译注2:原生JSON支持的需求已被提交为ES3.1的工作草案,另外IE8已经提供了原生的JSON支持。

在外部数据与innerHTML进行交互时还存在另一种危险。一种常见的Ajax模式是把服务器端

发送过来的一个HTML文本片段赋值给某个HTML元素的innerHTML属性。这是一个非 常糟糕的习惯。如果这个HTML包含一个 <script> 标签或其等价物,那么一个恶意脚本将 被运行。这可能又是因为服务端存在漏洞。

具体有什么危险呢?如果一个恶意脚本在你的页面上被运行,它就有权访问这个页面的所 有的状态和该页面能做的操作。它能与你的服务器进行交互,而你的服务器将不能区分正 当请求和恶意请求。恶意脚本还能访问全局对象,这使得它有权访问该应用中除隐藏于闭 包中的变量之外的所有数据。它可以访问document对象,这会使它有权访问用户所能看到 的一切。它还给这个恶意脚本提供了与用户进行会话的能力。浏览器的地址栏和所有的反 钓鱼程序将告诉用户这个会话是可靠的。document对象还给该恶意脚本授权访问网络,允 许它去下载更多的恶意脚本,或者是在你的防火墙之内探测站点,或者是将它已经窃取的 隐私内容发送给世界的任何一个服务器。

这个危险是JavaScript全局变量的直接后果,它是JavaScript众多糟粕之中最糟糕的一个。 这些危险并不是由Ajax、JSON、XMLHttpRequest或Web 2.0(不管它是什么)导致的。 自从JavaScript被引入浏览器,这些危险就已经存在了,并且它将一直存在,直到JavaScript 有一天被取代。所以,请务必当心。

3、一个JSON解析器

这是一个用JavaScript编写的JSON解析器的实现方案:

var json_parse=function(){

//这是一个能把JSON文本解析成JavaScript数据结构的函数。

//它是一个简单的递归降序解析器。

//我们在另一个函数中定义此函数,以避免创建全局变量

var at, //当前字符的索引

ch, //当前字符

escapee={

'"':'"',

json

'\\':'\\',

'/':'/',

b:'b',

f:'\f',

n:'\n',

r:'\r',

t:'\t'

},

text,json

error=function(m){

//当某处出错时,调用error。

name:'SyntaxError',

message:m,

at:at,

text:text

};

},

next=function(c){

//如果提供了参数c,那么检验它是否匹配当前字符。 if(c&&c!==ch){

error("Expected '"+c+"' instead of '"+ch+"'");

}

//获取下一个字符。当没有下一个字符时,返回一个空字符串。 ch=text.charAt(at);

at+=1;

return ch;

},

number=function(){

//解析一个数字值。

var number,

string='';

if(ch==='-'){

string='-';

next('-');

}

while(ch>='0'&&ch<='9'){

string+=ch;

next();

}

if(ch==='.'){

string+='.';

while(next()&&ch>='0'&&ch<='9'){

string+=ch;

}

}

if(ch==='e'||ch==='E'){

string+=ch;

next();

if(ch==='-'||ch==='+'){

string+=ch;

next();

}

while(ch>='0'&&ch<='9'){

string+=ch;

}

}

number=+string;

if(isNaN(number)){

error("Bad number");

}else{

return number;

}

},

string=function(){

//解析一个字符串值。

var hex,

i,

string='',

ufff;

//当解析字符串值时,我们必须找到"和\字符。 if(ch==='"'){

while(next()){

if(ch==='"'){

next();

return string;

}else if(ch==='\\'){

next();

if(ch==='u'){

uffff=0;

for(i=0;i<4;i+=1){

hex=parseInt(next(),16);

if(!isFinite(hex)){

break;

}

uffff=uffff*16+hex;

}

string+=String.fromCharCode(uffff); }else if(typeof escapee[ch]==='string'){ string+=escapee[ch];

}else{

break;

}

}else{

string+=ch;

}

}

}

</script>

本文来源:http://www.guakaob.com/yimin/285952.html

    【JSON入门详解 json】相关推荐