【问题标题】:php json_encode & jquery parseJSON single quote issuephp json_encode & jquery parseJSON 单引号问题
【发布时间】:2013-07-29 09:06:53
【问题描述】:

我搜索并阅读了大部分相关主题,但它们并不是我想要的。

我有一个带有json_encode PHP 函数的 JSON 编码字符串:

{"casts":["Matthew Modine","Adam Baldwin","Vincent D'Onofrio"],"year":1987}

我正在使用 jQuery 将值也放入适当的字段中,在测试的情况下,我执行了以下操作:

<script>
var obj = jQuery.parseJSON('<?=$data?>');
console.log(obj);
</script>

假设 $data 是这样的:

$data =
<<<END
{"casts":["Matthew Modine","Adam Baldwin","Vincent D'Onofrio"],"year":1987}
END;

在这种情况下 Google chrome 控制台会产生什么:

Uncaught SyntaxError: Unexpected identifier 

但是,当我更改 JSON 编码字符串时 - 将 反斜杠 添加到单引号:

{"casts":["Matthew Modine","Adam Baldwin","Vincent D\'Onofrio"],"year":1987}

控制台输出正常:

Object {casts: Array[3], year: 1987}
casts: Array[3]
year: 1987

问题:控制台中的这个错误是预期的吗?我认为用\' 转义或替换' 会很脏!

更新

实际上 $data 值来自 json_encode($var) 而 $var 是一个数组!

$data = json_encode($var);

【问题讨论】:

    标签: php jquery


    【解决方案1】:

    对于在 PHP 中传递 JSON 编码字符串的更广泛问题(例如,通过 cURL),使用 JSON_HEX_APOS 选项是解决此问题的最简洁方法。这也可以解决您的问题,尽管前面的答案是正确的,您不需要需要调用 parseJSON,并且 JavaScript 对象是相同的,无需在 $data 上调用 parseJSON。

    对于您的代码,您只需进行以下更改:

    json_encode($var)json_encode($var, JSON_HEX_APOS)

    以下是 jQuery 解析正确编码数据的示例:http://jsfiddle.net/SuttX/

    为了进一步阅读,这里有一个来自PHP.net json_encode manual entry 示例#2 的示例:

    $a = array('<foo>',"'bar'",'"baz"','&blong&', "\xc3\xa9");
    
    echo "Apos: ",    json_encode($a, JSON_HEX_APOS), "\n";
    

    这将输出:

    Apos: ["<foo>","\u0027bar\u0027","\"baz\"","&blong&","\u00e9"]
    

    可以在此处找到完整的 JSON 常量列表:PHP.net JSON constants

    【讨论】:

    • 这非常有效。对于使用 twig 的人,代码是 json_encode(constant('JSON_HEX_APOS'))。感谢您提供此解决方案。
    • 对我也有帮助的好答案
    【解决方案2】:

    但是,当我对 JSON 编码字符串进行更改时 - 将反斜杠添加到单引号

    在 PHP 字符串文字中转义它。然后将其作为简单的' 插入到 PHP 字符串中。

    如果您想在将其插入 JavaScript 之前对其进行转义,那么您需要在 out of json_encode 的字符串中添加斜杠(或者更确切地说,因为您没有使用它(您应该是!)您手动构建的 JSON 字符串)。

    不过,这比您需要的工作还多。真正的解决方案是记住 JSON 是 JavaScript 文字语法的子集:

    var obj = <?=$data?>;
    

    【讨论】:

    • +1 无需解析 - json_encode 的输出已经是有效的 JavaScript。
    • 最好指定JSON_HEX_TAG | JSON_HEX_AMP。至少前者可能是满足restrictions for contents of script elements 所必需的,如果文档可以被解析为 XML,那么两者都是必需的。
    • 您好 - 聚会有点晚了,但我遇到了完全相同的问题,这就是解决方法!您能否更详细地解释&lt;?=$data ?&gt; 的含义?这是写出 '` 还是有什么不同?
    • @user1775598 你说得对:&lt;?=&lt;?php echo 的简写
    【解决方案3】:

    您面临的问题是您将 json_encode 调用的结果作为字符串呈现给 JavaScript,而它是有效的 JavaScript。从输出中删除 jQuery.jsonParse 集,并将回显结果分配给相关的 JavaScript 变量。

    var obj = <?= json_encode(array("casts"=>array(
        "Matthew Modine","Adam Baldwin","Vincent D'Onofrio"
    ),"year"=>1987)); ?>;
    

    【讨论】:

    • 上面的代码对你有用……它也通过传递 javascript parseJson 步骤来显示。
    【解决方案4】:

    如果问题仅与单引号有关,这应该很简单:

    str_replace("'", "\'", json_encode($array));
    

    【讨论】:

      【解决方案5】:

      看看它真的对我有帮助

      $products_arr=array();
      $products_arr["category"]=array();
       while ($row = $cats->fetch(PDO::FETCH_ASSOC)){
      
          $product_item=array(
              "id" => $row['id'],
              "title" => json_encode($row['title'])// these will help you
          );
      
          array_push($products_arr["category"], $product_item);
      }
      
      echo json_encode($products_arr);
      

      【讨论】:

        猜你喜欢
        • 2011-09-21
        • 2012-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多