zoukankan      html  css  js  c++  java
  • (转)JavaScript的eval(“{JSON object string}”)问题

    转:http://www.web600.net/html/editor/JavaScript/200912291253.html

    在做jquery 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);

  • 相关阅读:
    vmware中3中网络模式的区别
    常用 Git 命令清单 转
    inotify监控目录变化重启服务器tornado项目
    sed处理url编码解码=== web日志的url处理
    LVM 'Can’t open /dev/sdb1 exclusively. Mounted filesystem?' Problem
    Vimium使用快捷键总结
    sed 引入shell变量
    shell 除法 小数点
    selinux 导致无法启动httpd
    linux查看ssh用户登录日志与操作日志
  • 原文地址:https://www.cnblogs.com/wangle1001986/p/2649084.html
Copyright © 2011-2022 走看看