当前位置: 首页 > 图文教程 > 网络编程 > Javascript > JavaScript的eval JSON object问题

Javascript
Javascript常用运算符(Operators)-javascript基础教程
JS是否可以跨文件同时控制多个iframe页面的应用技巧
不用ajax实现点击文字即可编辑的方法
用javascript来实现动画导航效果的代码
javascript支持firefox,ie7页面布局拖拽效果代码
IE与Firefox下javascript getyear年份的兼容性写法
javascript 不让鼠标事件触发
一个简单横向javascript日期控件
使Ext的Template可以解析二层的json数据的方法
表单项的name命名为submit、reset引起的问题
可以显示单图片,多图片ajax请求的ThickBox3.1类下载
两个DIV等高的JS的实现代码
支持IE和firefox的js代码美化加亮源码
2007/12/23更新创意无限,简单实用(javascript log)
DOMAssitant最新版 DOMAssistant 2.5发布
用js实现的页面关键字密度查询代码
Javascript函数加壳多用于事件绑定
收集的几个不错的javascript类小例子
javascript下function声明一些小结
JS的replace方法与正则表达式结合应用讲解

Javascript 中的 JavaScript的eval JSON object问题


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2010-01-10   浏览: 334 ::
收藏到网摘: n/a

在做AJAX应用开发的时候,我们通常喜欢把服务器端返回的JSON格式字符串在客户端的回调函数中把它作为JavaScript代码执行并用一个变量保存起来,以方便使用返回的数据。 通常的做法就是var jsonData = eval(xmlHttp.responseText)。这看起来似乎一切都是正确的,但当你运行代码的时候,你会发现报“invalid labe”错误了。为什么?我也不清楚,但我找到了解决这个问题的方法。
在我刚遇到这个问题的时候也特别头痛,因为看起来所有编码是正确的,为了测试出现问题的位置,我逐渐缩小代码范围,最终得到如下简短代码:
复制代码 代码如下:

var jsonStr1 = '{"Name":"Tom","Sex":"Man"}';
var jsonObj1 = eval(jsonStr1);
alert(jsonObj1.Name);

以上代码执行正是报一开始说的invalid labe错误。难道eval函数对某些表达式或对象有限制?于是我又测试了数组对象,代码如下,结果下面代码运行很正常:
复制代码 代码如下:

var arrStr = '["Tom","Man"]';
var arrObj = eval(arrStr);
alert(arrObj[0]);

难道是我机子上的JavaScript解析器就JSON解析方面出了问题,于是我又测试下面代码,但结果一样正常:
复制代码 代码如下:

var jsonObj = {"Name":"Tom","Sex":"Man"};
alert(jsonObj.Name);

最终我还是没有自行把问题解决,于是根据相关错误信息上网搜索答案,没想到一下子就找到了问题的根源,解决办法就是“在eval的时候,要先把 JSON字符串值用 ‘()'括号先括起来”。网上找的资料都没有说明是什么原因,当然我也还是没有明白正真的原因的。括号是起强制先执行或先运算作用的,返回的JSON就一个完整的对象,中间也没有表达式,为什么还要加括号!像数组这种较复杂点的对象也能正常eval。没办法,就先记着这种用法吧。正确用法如下(注意看eval两端的括号):
复制代码 代码如下:

var jsonStr2 = '{"Name":"Tom","Sex":"Man"}';
var jsonObj2 = eval('(' + jsonStr2 + ')');
alert(jsonObj2.Name);