php json_encode & jquery parseJSON 单引号问题
Posted
技术标签:
【中文标题】php json_encode & jquery parseJSON 单引号问题【英文标题】:php json_encode & jquery parseJSON single quote issue 【发布时间】: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);
【问题讨论】:
【参考方案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,那么两者都是必需的。
您好 - 聚会有点晚了,但我遇到了完全相同的问题,这就是解决方法!您能否更详细地解释<?=$data ?>
的含义?这是写出 '` 还是有什么不同?
@user1775598 你说得对:<?=
是<?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);
【讨论】:
以上是关于php json_encode & jquery parseJSON 单引号问题的主要内容,如果未能解决你的问题,请参考以下文章
使用 PHP json_encode() 和 MySQL 返回一个 JSON 对象以传递给 jQuery 函数 [重复]