我使用jQuery.post()向服务器发出请求,服务器返回JSON对象(如{"var": "value",…})。但是,如果任何值包含一个单引号(正确转义为\'),jQuery将无法解析其他有效的JSON字符串。以下是我的意思的一个例子(在Chrome的控制台):
data = "{ \"status\": \"success\", \"newHtml\": \"Hello \\\'x\" }";
eval("x = " + data); // { newHtml: "Hello 'x", status: "success" }
$.parseJSON(data); // Invalid JSON: { "status": "success", "newHtml": "Hello \'x" }
这正常吗?是否没有办法通过JSON正确地传递单引号?
我知道问题在哪里,当我查看规范时,很明显,未转义的单引号应该被正确解析。
我正在使用jquery的jquery。parseJSON函数来解析JSON字符串,但是当使用json_encode准备的数据中有一个单引号时,仍然会得到解析错误。
这可能是一个错误,在我的实现看起来像这样(PHP -服务器端):
$data = array();
$elem = array();
$elem['name'] = 'Erik';
$elem['position'] = 'PHP Programmer';
$data[] = json_encode($elem);
$elem = array();
$elem['name'] = 'Carl';
$elem['position'] = 'C Programmer';
$data[] = json_encode($elem);
$jsonString = "[" . implode(", ", $data) . "]";
最后一步是我将JSON编码的字符串存储到一个JS变量中:
<script type="text/javascript">
employees = jQuery.parseJSON('<?=$marker; ?>');
</script>
如果我使用“”而不是“,它仍然抛出一个错误。
解决方案:
唯一对我有用的是使用位掩码JSON_HEX_APOS来转换单引号,就像这样:
json_encode($tmp, JSON_HEX_APOS);
有没有别的办法解决这个问题?我的代码是错误的还是写得很糟糕?
谢谢
使用CakePHP使用PHP的本地json_encode输出JavaScript脚本块时,也遇到了类似的问题。$contractorCompanies包含有单引号的值,如上所述,预期json_encode($contractorCompanies)不会转义它们,因为它是有效的JSON。
<?php $this->Html->scriptBlock("var contractorCompanies = jQuery.parseJSON( '".(json_encode($contractorCompanies)."' );"); ?>
通过在JSON编码的字符串周围添加addslashes(),然后转义引号,允许Cake / PHP将正确的javascript回显到浏览器。JS错误消失。
<?php $this->Html->scriptBlock("var contractorCompanies = jQuery.parseJSON( '".addslashes(json_encode($contractorCompanies))."' );"); ?>