【问题标题】:Parsing JSON with Javascript用 Javascript 解析 JSON
【发布时间】:2026-02-13 03:50:01
【问题描述】:

我从 AJAX 调用中收到了这个 JSon 字符串:

{status:OK,addresses:[0,1,2,3,4,5]}

要将其转换为 JSON 对象,我有这行:

var jsonObj = eval(jsonString);

但是抛出异常!这个在异常变量中没有消息。 我也尝试过使用

{"status":"OK","addresses":[0,1,2,3,4,5]}

而且,又一次抛出异常,但说发现了意外的字符“&”。

我正在使用 Struts2,并且从一个动作中接收到 JSon。

任何帮助将不胜感激。 谢谢

【问题讨论】:

  • 那不是 JSON 字符串。它甚至不是一个有效的 JavaScript 对象字面量。第二个版本是 JSON,我希望 eval 能够处理它(但应该避免使用 eval,去获取 json2.js)。由于数据中的任何地方都没有&,因此它一定来自您未提供的代码。由于我们看不到这一点,我们无法告诉您如何解决它。
  • 所以我验证了当从请求中接收到 JSon 时,所有的“都被替换为”......这可能是问题吗?
  • 是的!解析器期待 JSON 而不是 HTML 编码的 JSON!
  • 那么...我怎样才能避免它以编码的 HTML 形式出现?我只有一个打印 Strut Action 中定义的属性的 JSP。

标签: javascript json exception struts2


【解决方案1】:
{status:OK,addresses:[0,1,2,3,4,5]}

不是有效的 JSON,因为缺少 statusaddresses 的引号,并且既不是有效的 JSON,也不是有效的 JavaScript,因为缺少了 OK 的引号。

另外,不要使用eval 来解析 JSON - 它允许攻击者在您的页面上下文中执行任意 JavaScript。相反,请使用安全的替代方案 JSON.parse(内置在现代浏览器和其他 EcmaScript 5 实现中)或 JSON2

【讨论】:

  • @Stargazer712 你能提供一个来源吗? json.org 的官方语法非常清楚地表明需要引号。此外,Python、Chromium 的解析器和 trivialjson(我的解析器;))拒绝 {a:1}
【解决方案2】:

不要使用eval:使用适当的 JSON 解析器,例如 JSON2

您可能在响应中有额外的内容:检查您没有打印出任何其他内容。

【讨论】:

    【解决方案3】:

    这对我有用:

    JSON.parse('{ "status" : "OK", "addresses" : [0,1,2,3,4,5]}');
    

    【讨论】:

      【解决方案4】:

      如果你想使用eval,那么你需要使用你发布的second示例({"status":"OK","addresses":[0,1,2,3,4,5]})并且你需要用括号将字符串括起来:

      var jsonObj = eval( '('+jsonString+')' );
      

      这使得 jsonString 成为有效的 javascript 语句。

      话虽如此,我鼓励您使用JSON.parse,正如许多其他人所发布的那样。它更安全。

      【讨论】:

      【解决方案5】:

      您没有 JSON 字符串。你确实有一个对象文字。您需要在名称中加上引号。

      {"status":OK, "addresses":[0,1,2,3,4,5]}
      

      【讨论】:

      • OP 没有使用 JSON 解析器,只是 eval 所以真的只需要它是有效的 javascript,它需要在“OK”周围加上引号,而不是对象键。
      【解决方案6】:

      基于此评论:

      所以我验证了当从请求中收到 JSon 时,所有的“都被替换为”......这可能是问题吗?

      是的。 JSON 解析器期望接收 JSON 作为输入,而不是 HTML 编码的 JSON。

      【讨论】:

        【解决方案7】:

        需要解决的两个问题:

        1. 在“OK”周围添加引号,使其成为合法的 javascript 字符串。
        2. 在发送到 eval 之前在字符串周围添加括号,如下所示 eval("(" + jsonString + ")")';

        这个:

        {status:OK,addresses:[0,1,2,3,4,5]}
        

        必须改成这样:

        {status:"OK",addresses:[0,1,2,3,4,5]}
        

        是有效的Javascript(注意“OK”周围的引号)。

        这应该是有效的 JSON(也应该在键周围加上引号):

        {"status":"OK", "addresses":[0,1,2,3,4,5]}
        

        OK all 本身并不是一段已知的 Javascript,如果没有引号将其变成 Javascript 字符串。以后,你可以在一个小测试台上测试自己,看看你最喜欢的 javascript 调试器中的错误是什么:

        http://jsfiddle.net/jfriend00/FcSKR/

        var jsonString = '{"status":"OK","addresses":[0,1,2,3,4,5]}';
        var jsonObj = eval("(" + jsonString + ")");
        alert("success");
        

        如果您仍然收到{"status":"OK","addresses":[0,1,2,3,4,5]} 错误并且在发送到 eval 之前添加了括号,那么您的数据不是您认为的那样,您需要进行一些调试以查看响应中的确切内容(查看调试器中的值,将值放入警报等...)。响应中可能还有一些您不知道会出现的其他内容。

        注意:在某些情况下,像 JSON.parse() 这样的 JSON 解析器和合法的 JSON 字符串比使用 Javascript 的 eval() 更安全。

        【讨论】:

        • 那不是 JSON 字符串,而是文字 JavaScript 对象。括号是必需的。 jsfiddle.net/FcSKR/2
        • 好的,我在它周围添加了括号,尽管我的帖子主要只是讨论 Javascript 和 eval 的使用,因为那是 OP 正在使用的。
        • 你真的不懂。你仍然没有做任何接近他要求的事情。 看看我发布的小提琴。它解释了你做错了什么。
        • 我的错误。我的小提琴正在分配 var jsonString = {"status":"OK","addresses":[0,1,2,3,4,5]}; 这不是字符串,这就是为什么我没有发现需要括号的原因。我已经修复了我的帖子。感谢您发现我的错误。因此,有两个问题可以使它与 eval 一起使用(“OK”周围的引号和整个事物周围的括号)和第三个问题使其有效 JSON(对象键周围的引号)。
        • 感谢您的收听。删除了 -1 :)