【问题标题】:Associative Array does not work with eval() JavaScript关联数组不适用于 eval() JavaScript
【发布时间】:2011-10-07 23:14:39
【问题描述】:

我正在生成一个表示为 Python 字典的数据,该字典使用 simplejson 通过这种格式的 url 转储。

{"2": "London", "3": "Tokyo", "4": "Sydney"}

我正在使用$.get 并将其存储到变量数据中。 但是eval(data) 不会生成关联数组。实际上抛出一个错误。问题是什么?解决办法是什么?

编辑:我已经分享了代码 http://dpaste.com/570901/

【问题讨论】:

    标签: javascript jquery python json


    【解决方案1】:

    您的错误是因为在语句开头的{ 被读取为代码块(就像您在ifs 和fors 中使用的那种),而不是作为对象文字。您可以在 eval 周围加上括号,按照您的意愿进行操作:

    eval('(' + str + ')');
    

    当然,eval 是邪恶的,你应该改用 JSON.parse 之类的东西。大多数新浏览器都有这个功能,它不仅更安全,而且速度更快。

    【讨论】:

    • eval 不是邪恶的。 eval 没有道德指南针,实际上没有知觉。
    • 这只是它想让你想的。就在我们说话的时候,Eval 可能正在密谋毁灭人类!
    • 我们计划的是统治世界而不是毁灭......我的意思是......(eval 会杀了我......)
    【解决方案2】:

    我们需要查看更多代码...

    var x = '{"2": "London", "3": "Tokyo", "4": "Sydney"}';
    
    eval('var y = ' + x);
          // or
    var y = eval('(' + x + ')');
    
    console.log(y);
    console.log(y["2"]);
    

    以上工作正常。你到底在做什么/不做什么?

    PS:无论如何你都不应该使用eval,但了解它的工作原理很重要。

    【讨论】:

    • 我们不需要再看任何代码了。您的代码有效,因为您正在评估与 OP 不同的东西。请参阅其他一些回复,例如missingno 以获得解释。
    • @jdigital: eval(data) 与上述eval(x) 同步,我希望你意识到这一点
    • 您正在评估“var y = { ... }”,而他正在评估“{...}”。而且我假设您的意思是“同义词”,而不是“同步”;-)
    • @jdigital:我实际上展示了两种eval'ing 声明的方式。是的,同义词:)
    • 是的,但两者都不同于 OP。无论如何,其他人已经回答了这个问题,而无需查看任何其他代码。也许我对你的第一句话和第二句话读得太多了,所以为什么不简单地说“这里有两种方法可以使这项工作”。
    【解决方案3】:

    eval 速度慢、效率低且难以调试。不要使用它。

    让你的脚本输出一个application/json content-type 标头,jQuery 会自动将 JSON 转换为 JS 对象。

    【讨论】:

      【解决方案4】:

      请记住,您正在评估 JavaScript 代码而不是 JSON。从外观上看,您的字符串将评估为一个块,但第一部分在语法上不正确。 ("2": 接近于带标签的语句,但没有雪茄。)您需要将字符串括在括号中以将其视为对象文字。

      【讨论】:

        【解决方案5】:

        使用 jquery 的 $.get() 函数,您可以告诉它返回一个 json 字符串(将“dataType”设置为“json”),它会为您创建一个对象,不需要 eval()。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-04-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-13
          • 1970-01-01
          • 2014-01-13
          • 2020-08-31
          相关资源
          最近更新 更多