【问题标题】:What is limiting this JSON parse and what can I do to fix it?什么限制了这个 JSON 解析,我能做些什么来修复它?
【发布时间】:2017-02-21 05:42:59
【问题描述】:

这个问题很容易理解和演示。

这段代码运行良好:

<?php
    $title = array("dfg","sdfsdg","asfas","Sdfh","Ssdth","Csdgo");
    $title_json = json_encode($title);
?>
<script>
    var obj = JSON.parse('<?= $title_json; ?>');
    console.log(obj);
</script>

这段代码没有:

<?php
    $title = array("Is President Trump still using his old Android phone?","Trump sets a dizzying WH pace in first days","Trumps White House Charm Offensive a Contrast to Solitary Obama","The inside story of a basketball teen so tall, he doesn't look real","Scientists say they are closer to making Star Wars holograms","Sperm theft lawsuit leaves appeals court weighing how much a life is worth","Call it Smunday: Heinz pushing to make Super Bowl Monday a national holiday");
    $title_json = json_encode($title);
?>
<script>
    var obj = JSON.parse('<?= $title_json; ?>');
    console.log(obj);
</script>

控制台中的输出错误:Uncaught SyntaxError: missing ) after argument list - (index):20 其中第 20 行是 JSON.parse 之一,如果您查看页面的源代码,则该行显示为:

var obj = JSON.parse('["Is President Trump still using his old Android phone?","Trump sets a dizzying WH pace in first days","Trump's White House Charm Offensive a Contrast to Solitary Obama","The inside story of a basketball teen so tall, he doesn't look real","Scientists say they are closer to making 'Star Wars' holograms","Sperm theft lawsuit leaves appeals court weighing how much a life is worth","Call it 'Smunday': Heinz pushing to make Super Bowl Monday a national holiday"]');

您可能会注意到两个代码示例完全相同,数组甚至具有相同的长度,唯一的区别是第二个中的字符串更长。这是否意味着 JSON 可以解析的字符串存在最大长度?

【问题讨论】:

  • 请注意,在浏览器中显示该行的位置,SO 添加到代码中的基于颜色的语法突出显示暗示了问题。
  • 现在你可以使用`(又名反引号)来包装字符串。 (即var obj = JSON.parse(`["Is Pre..."]`);
  • @nnnnnn 实际上,如果我使用的 IDE 共享该突出显示,我可能永远不需要问这个问题,我会知道这是撇号。当然,我仍然不知道我什至不需要 JSON.parse 并且会花一段时间试图弄清楚如何逃避撇号。
  • 请注意,这些不带引号的答案确实假定您的json_encode fails silently 永远不会出现这种情况(比如提供了错误的数据)。因为这将导致前端的 js 看起来像 var obj = ;,这将抛出 Uncaught SyntaxError: Unexpected token ;
  • 该数组是从数据库中填充的,该数据库本身由表单中的条目填充,因此假设我正确设置了表单验证,应该没有错误数据。

标签: javascript php json


【解决方案1】:

您的 JSON 数据包含 '。因此,如果您将该数据注入到' 分隔的字符串文字中,该字符串文字将过早关闭并导致语法错误。简单例子:

var foo = '{"key": "This key's value"}';

如果您查看生成的 JavaScript 源代码,您应该注意到这一点。

这里不需要使用JSON.parse。注入的 JSON 可以解释为 JavaScript 对象/数组字面量:

var obj = <?= $title_json; ?>;

另请参阅:How to pass variables and data from PHP to JavaScript?

【讨论】:

  • 那么在什么情况下我需要 JSON.parse,我只是在关注一篇文章,上面说是如何将 PHP 数组传递给 javascript。
  • 如果您有一个包含 JSON 的字符串值,则需要 JSON.parse。例如,如果您执行 XMLHTTPRequest 并获取 JSON 作为响应,就会发生这种情况。但是在这里,您正在从 PHP 生成 JavaScript 源代码。由于 JSON 可以被解析为 JavaScript 源代码(如果它位于正确的位置),您可以将其作为对象/数组直接注入源代码,而不是将其作为字符串文字的内容注入。正如您所注意到的,这很容易出错,因为某些字符和字符序列在字符串文字中具有不同的含义。
  • 也许这有点牵强,但考虑一下这个例子:如果你只有一个数字值,你可能会使用var n = &lt;= 42;&gt;; 而不是var n = eval('&lt;= 42;&gt;');eval 是不必要的,因为 42 在 JS 中是一个有效的数字文字(这个例子的不足之处是 eval 如果它不是有效的 JS 代码,无论如何都不会工作,但是¯\_(ツ)_ /¯)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-30
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-19
  • 1970-01-01
相关资源
最近更新 更多