比较详细的关于javascript 解析json的代码


Posted in Javascript onDecember 16, 2009

JSON的规则很简单: 对象是一个无序的“‘名称/值'对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值' 对”之间使用“,”(逗号)分隔。具体细节参考http://www.json.org/json-zh.html

举个简单的例子:

js 代码

function showJSON() { 
var user = 
{ 
"username":"andy", 
"age":20, 
"info": { "tel": "123456", "cellphone": "98765"}, 
"address": 
[ 
{"city":"beijing","postcode":"222333"}, 
{"city":"newyork","postcode":"555666"} 
] 
} alert(user.username); 
alert(user.age); 
alert(user.info.cellphone); 
alert(user.address[0].city); 
alert(user.address[0].postcode); 
}

这表示一个user对象,拥有username, age, info, address 等属性。

同样也可以用JSON来简单的修改数据,修改上面的例子

js 代码

function showJSON() { 
var user = 
{ 
"username":"andy", 
"age":20, 
"info": { "tel": "123456", "cellphone": "98765"}, 
"address": 
[ 
{"city":"beijing","postcode":"222333"}, 
{"city":"newyork","postcode":"555666"} 
] 
} alert(user.username); 
alert(user.age); 
alert(user.info.cellphone); 
alert(user.address[0].city); 
alert(user.address[0].postcode); 
user.username = "Tom"; 
alert(user.username); 
}

JSON提供了json.js包,下载http://www.json.org/json.js 后,将其引入然后就可以简单的使用object.toJSONString()转换成JSON数据。

js 代码

function showCar() { 
var carr = new Car("Dodge", "Coronet R/T", 1968, "yellow"); 
alert(carr.toJSONString()); 
} function Car(make, model, year, color) { 
this.make = make; 
this.model = model; 
this.year = year; 
this.color = color; 
}

可以使用eval来转换JSON字符到Object

js 代码

function myEval() { 
var str = '{ "name": "Violet", "occupation": "character" }'; 
var obj = eval('(' + str + ')'); 
alert(obj.toJSONString()); 
}

或者使用parseJSON()方法

js 代码

function myEval() { 
var str = '{ "name": "Violet", "occupation": "character" }'; 
var obj = str.parseJSON(); 
alert(obj.toJSONString()); 
}

下面使用prototype写一个JSON的ajax例子。

先写一个servlet (我的是servlet.ajax.JSONTest1.java)就写一句话

java 代码

response.getWriter().print("{ \"name\": \"Violet\", \"occupation\": \"character\" }");
再在页面中写一个ajax的请求

js 代码

function sendRequest() { 
var url = "/MyWebApp/JSONTest1"; 
var mailAjax = new Ajax.Request( 
url, 
{ 
method: 'get', 
onComplete: jsonResponse 
} 
); 
} function jsonResponse(originalRequest) { 
alert(originalRequest.responseText); 
var myobj = originalRequest.responseText.parseJSON(); 
alert(myobj.name); 
}

prototype-1.5.1.js中提供了JSON的方法,String.evalJSON(), 可以不使用json.js, 修改上面的方法

js 代码

function jsonResponse(originalRequest) { 
alert(originalRequest.responseText); 
var myobj = originalRequest.responseText.evalJSON(true); 
alert(myobj.name); 
}

JSON还提供了java的jar包 http://www.json.org/java/index.html API也很简单,下面举个例子

在javascript中填加请求参数

js 代码

function sendRequest() { 
var carr = new Car("Dodge", "Coronet R/T", 1968, "yellow"); 
var pars = "car=" + carr.toJSONString(); var url = "/MyWebApp/JSONTest1"; 
var mailAjax = new Ajax.Request( 
url, 
{ 
method: 'get', 
parameters: pars, 
onComplete: jsonResponse 
} 
); 
}

使用JSON请求字符串就可以简单的生成JSONObject并进行解析,修改servlet添加JSON的处理(要使用json.jar)

java 代码

private void doService(HttpServletRequest request, HttpServletResponse response) throws IOException { 
String s3 = request.getParameter("car"); 
try { 
JSONObject jsonObj = new JSONObject(s3); 
System.out.println(jsonObj.getString("model")); 
System.out.println(jsonObj.getInt("year")); 
} catch (JSONException e) { 
e.printStackTrace(); 
} 
response.getWriter().print("{ \"name\": \"Violet\", \"occupation\": \"character\" }"); 
}

同样可以使用JSONObject生成JSON字符串,修改servlet

java 代码

private void doService(HttpServletRequest request, HttpServletResponse response) throws IOException { 
String s3 = request.getParameter("car"); 
try { 
JSONObject jsonObj = new JSONObject(s3); 
System.out.println(jsonObj.getString("model")); 
System.out.println(jsonObj.getInt("year")); 
} catch (JSONException e) { 
e.printStackTrace(); 
} JSONObject resultJSON = new JSONObject(); 
try { 
resultJSON.append("name", "Violet") 
.append("occupation", "developer") 
.append("age", new Integer(22)); 
System.out.println(resultJSON.toString()); 
} catch (JSONException e) { 
e.printStackTrace(); 
} 
response.getWriter().print(resultJSON.toString()); 
}

js 代码
function jsonResponse(originalRequest) { 
alert(originalRequest.responseText); 
var myobj = originalRequest.responseText.evalJSON(true); 
alert(myobj.name); 
alert(myobj.age); 
}

参考

http://www.json.org/js.html

http://www.blogjava.net/Jkallen/archive/2006/03/28/37905.html

http://www.json.org/

http://www.prototypejs.org/learn/json

http://www.json.org/java/index.html

http://www.ibm.com/developerworks/cn/web/wa-ajaxintro10/index.html

使用JSON
JSON也就是JavaScript Object Notation,是一个描述数据的轻量级语法。JSON的优雅是因为它是JavaScript语言的一个子集。接下来你将看到它为什么如此重要。首先,来比较一下JSON和XML语法。

JSON和XML都使用结构化方法描述数据。例如一个地址簿应用程序可以提供用来产生XML格式的地址卡的web服务:

<?xml version='1.0' encoding='UTF-8'?> 
<card> 
<fullname>Sean Kelly</fullname> 
<org>SK Consulting</org> 
<emailaddrs> 
<address type='work'>kelly@seankelly.biz</address> 
<address type='home' pref='1'>kelly@seankelly.tv</address> 
</emailaddrs> 
<telephones> 
<tel type='work' pref='1'>+1 214 555 1212</tel> 
<tel type='fax'>+1 214 555 1213</tel> 
<tel type='mobile'>+1 214 555 1214</tel> 
</telephones> 
<addresses> 
<address type='work' format='us'>1234 Main St 
Springfield, TX 78080-1216</address> 
<address type='home' format='us'>5678 Main St 
Springfield, TX 78080-1316</address> 
</addresses> 
<urls> 
<address type='work'>http://seankelly.biz/</address> 
<address type='home'>http://seankelly.tv/</address> 
</urls> 
</card>

使用JSON, 形式如下:
{ 
"fullname": "Sean Kelly", 
"org": "SK Consulting", 
"emailaddrs": [ 
{"type": "work", "value": "kelly@seankelly.biz"}, 
{"type": "home", "pref": 1, "value": "kelly@seankelly.tv"} 
], 
"telephones": [ 
{"type": "work", "pref": 1, "value": "+1 214 555 1212"}, 
{"type": "fax", "value": "+1 214 555 1213"}, 
{"type": "mobile", "value": "+1 214 555 1214"} 
], 
"addresses": [ 
{"type": "work", "format": "us", 
"value": "1234 Main StnSpringfield, TX 78080-1216"}, 
{"type": "home", "format": "us", 
"value": "5678 Main StnSpringfield, TX 78080-1316"} 
], 
"urls": [ 
{"type": "work", "value": "http://seankelly.biz/"}, 
{"type": "home", "value": "http://seankelly.tv/"} 
] 
}

如你所看到的,JSON有结构化的嵌套数据元素,这一点和XML相似。JSON也是基于文本的,XML也是如此。两者都使用Unicode。JSON和XML都很容易阅读。主观上,JSON更清晰,冗余更少。JSON WEB站点严格地描述了JSON语法,目前就是这样的。它确实是一个简单的小语言! XML确实适合标记文档,但是JSON是数据交互的理想格式。每个JSON文档描述了一个这样一个对象,该对象包含有:嵌套对象、数组、字符串、数字、布尔值或空值。

在这些地址卡例子代码中,JSON版本是更轻量级的,只占用了682字节的空间,而XML版本需要744字节空间。尽管这不是一个可观的节省。而实际的好处则来自解析过程。

XML对比JSON:地位丧失
通过使用XMLHttpRequest对象,可以从你的基于AJAX的应用程序取得XML和JSON文件。典型的,交互代码如下:

var req = new XMLHttpRequest(); 
req.open("GET", "http://localhost/addr?cardID=32", /*async*/true); 
req.onreadystatechange = myHandler; 
req.send(/*no params*/null);

作为WEB服务器响应,你提供的处理器函数(myHandler函数)被多次调用,为你提供提前终止事务,更新进度条等机会。通常的,只有在web请求完成以后才起作用:那时,你就可以使用返回的数据了。

为了处理XML版本的地址卡数据,myHandler的代码如下:

function myHandler() { 
if (req.readyState == 4 /*complete*/) { 
// Update address field in a form with first street address 
var addrField = document.getElementById('addr'); 
var root = req.responseXML; 
var addrsElem = root.getElementsByTagName('addresses')[0]; 
var firstAddr = addrsElem.getElementsByTagName('address')[0]; 
var addrText = fistAddr.firstChild; 
var addrValue = addrText.nodeValue; 
addrField.value = addrValue; 
} 
}

值得注意的是你不必解析XML文档:XMLHttpRequest对象自动地解析了,并使responseXML中的DOM树可用。通过使用responseXML属性,可以调用getElementsByTagName方法查找文档的地址部分,你还可以使用第一个去找到它。然后,可以再次调用getElementsByTagName在地址部分查找第一个地址元素。这就取得了文档的第一个DOM子节点,就是一个文本节点,并取得节点的值,这就是你想要的街道地址。最后,可以在表单域中显示结果。

确实不是一个简单的工作,现在,使用JSON再试一下:

function myHandler() { 
if (req.readyState == 4 /*complete*/) { 
var addrField = document.getElementById('addr'); 
var card = eval('(' + req.responseText + ')'); 
addrField.value = card.addresses[0].value; 
} 
}

你所做的第一件事情就是解析JSON响应。但是,因为JSON是JavaScript的一个子集,你可以使用JavaScript自己的编译器来解析它,通过调用eval函数。解析JSON仅需要一行!此外,操纵JSON中的对象就像操纵其他JavaScript对象一样。这显然要比通过DOM树来操纵简单,例如:
card.addresses[0].value 是第一个街道地址, "1234 Main Stb &"
card.addresses[0].type 是地址类型, "work"
card.addresses[1] 是家庭地址对象
card.fullname 是card的名称, "Sean Kelly"
如果更仔细观察,你可能会发现XML格式中文档至少有一个跟元素,card。这在JSON里是不存在的,为什么? 大概就是,如果你正在开发JavaScript来访问Web服务,你已经知道你想要得到的。然而,你可以在JSON中这么使用:
{"card": {"fullname": ...}}
使用这个技术,你的JSON文件总是以一个带有单一命名属性的对象开始,该属性标识了对象的种类。

JSON是快速可靠的吗?
JSON提供轻量的小文档,并且JSON在JavaScript更容易使用。XMLHttpRequest自动为你解析了XML文档,而你还要手工解析JSON文件,但是解析JSON比解析XML更慢么?作者通过几千次的反复测试,使用XMLHttpRequest解析XML和解析JSON,结果是解析JSON比XML要快10倍!当把AJAX当作桌面应用看待时,速度是最重要的因素,很明显,JSON更优秀。

当然,你不能总是控制服务器端来为AJAX程序产生数据。你还可以使用第三方服务器代替服务器提供XML格式的输出。并且,如果服务器恰好提供JSON,你可以确定你真的想使用它吗?

代码中值得注意的是,你将响应文本直接传入到eval中。如果你控制着服务器,就可以这么做。如果不是,一个恶意服务器可以使你的浏览器执行危险操作。在这样的情况下,你最好使用写在JavaScript中的代码来解析JSON。幸运地,这已经有了。

说到解析,Python爱好者可能注意到JSON不只是JavaScript的子集,它还是Python的一个子集。你可以在Python中直接执行JSON,或者使用安全JSON解析代替。JSON.org网站列举了许多常用JSON解析器。

服务器端的JSON
到现在为止,你或许将焦点注意在运行在客户浏览器中的基于AJAX的web应用程序使用JSON。自然地,首先,JSON格式的数据必须在服务器端产生。幸运地是,创建JSON或将其他存在的数据转换成JSON是相当简单的。一些WEB应用程序框架,例如TurboGears,自动包括对JSON输出的支持。

此外商业WEB服务提供商也注意到了JSON。Yahoo最近创建了许多基于JSON的web服务。Yahoo的多种搜索服务,履行计划,del.icio.us,还有高速公路交通服务也都支持JSON输出。毫无疑问,其他主要WEB服务提供商也将加入到对JSON的支持中。

总结
JSON的聪明在于它是JavaScript和Python的子集,使得它更易用,为AJAX提供高效的数据交互。它解析更快,比XML更易使用。JSON正成为现在“Web 2.0”的最强音。每个开发者,无论是标准桌面应用程序或Web应用程序,越来越注意到了它的简单和便捷。我希望你能体会到在buzzword-compliant, Web-2.0-based, AJAX-enabled, 敏捷开发中应用到JSON的乐趣。

Javascript 相关文章推荐
Jquery Ajax学习实例4 向WebService发出请求,返回实体对象的异步调用
Mar 16 Javascript
Asp.net下使用Jquery Ajax传送和接收DataTable的代码
Sep 12 Javascript
读jQuery之十三 添加事件和删除事件的核心方法
Aug 23 Javascript
HTML长文本截取含有HTML代码同样适用的两种方法
Jul 31 Javascript
使用JSLint提高JS代码质量方法分享
Dec 16 Javascript
Extjs的FileUploadField文件上传出现了两个上传按钮
Apr 29 Javascript
深入探讨JavaScript、JQuery屏蔽网页鼠标右键菜单及禁止选择复制
Jun 10 Javascript
js制作可以延时消失的菜单
Jan 13 Javascript
three.js中文文档学习之通过模块导入
Nov 20 Javascript
JS脚本加载后执行相应回调函数的操作方法
Feb 28 Javascript
理解 JavaScript EventEmitter
Mar 29 Javascript
vue配置型表格基于el-table拓展之table-plus组件
Apr 12 Vue.js
JQuery读取XML文件数据并显示的实现代码
Dec 16 #Javascript
js实现页面打印功能实例代码(附去页眉页脚功能代码)
Dec 15 #Javascript
jQuery 渐变下拉菜单
Dec 15 #Javascript
多浏览器兼容的获取元素和鼠标的位置的js代码
Dec 15 #Javascript
讨论javascript(一)工厂方式 js面象对象的定义方法
Dec 15 #Javascript
查询绑定数据岛的表格中的文本并修改显示方式的js代码
Dec 15 #Javascript
jquery自动完成插件(autocomplete)应用之PHP版
Dec 15 #Javascript
You might like
一个php作的文本留言本的例子(三)
2006/10/09 PHP
PHP设计模式之解释器模式的深入解析
2013/06/13 PHP
在PHP站点的页面上添加Facebook评论插件的实例教程
2016/01/08 PHP
php 截取GBK文档某个位置开始的n个字符方法
2017/03/08 PHP
Jquery Ajax 学习实例2 向页面发出请求 返回JSon格式数据
2010/03/15 Javascript
Javascript 面向对象(二)封装代码
2012/05/23 Javascript
屏蔽script注入小例子
2013/11/12 Javascript
JS 屏蔽键盘不可用与鼠标右键不可用的方法
2013/11/18 Javascript
JavaScript获取按钮所在form表单id的方法
2015/04/02 Javascript
JavaScript对象数组排序函数及六个用法
2015/12/23 Javascript
Boostrap栅格系统与自己额外定义的媒体查询的冲突问题
2017/02/19 Javascript
Bootstrap标签页(Tab)插件使用方法
2017/03/21 Javascript
js oncontextmenu事件使用详解
2017/03/25 Javascript
详解Angular Reactive Form 表单验证
2017/07/06 Javascript
node+koa实现数据mock接口的方法
2017/09/20 Javascript
vue初尝试--项目结构(推荐)
2018/01/30 Javascript
vue实现todolist基本功能以及数据存储功能实例详解
2019/04/11 Javascript
Flutter 超实用简单菜单弹出框 PopupMenuButton功能
2019/08/06 Javascript
vue-router 中 meta的用法详解
2019/11/01 Javascript
vue 查看dist文件里的结构(多种方式)
2020/01/17 Javascript
Python制作CSDN免积分下载器
2015/03/10 Python
Python爬虫抓取代理IP并检验可用性的实例
2018/05/07 Python
python 制作自定义包并安装到系统目录的方法
2018/10/27 Python
Python3.5迭代器与生成器用法实例分析
2019/04/30 Python
利用PyCharm操作Github(仓库新建、更新,代码回滚)
2019/12/18 Python
python正则表达式匹配IP代码实例
2019/12/28 Python
python GUI库图形界面开发之PyQt5单选按钮控件QRadioButton详细使用方法与实例
2020/02/28 Python
Python request中文乱码问题解决方案
2020/09/17 Python
python 求两个向量的顺时针夹角操作
2021/03/04 Python
JavaScript+Canvas实现自定义画板的示例代码
2019/05/13 HTML / CSS
关于webview适配H5上传照片或者视频文件的方法
2020/11/04 HTML / CSS
我们是伦敦女孩:WalG
2018/01/08 全球购物
vue实现简单数据双向绑定
2021/04/28 Vue.js
Pytest中skip和skipif的具体使用方法
2021/06/30 Python
纯html+css实现打字效果
2021/08/02 HTML / CSS
python自动化操作之动态验证码、滑动验证码的降噪和识别
2021/08/30 Python