PHP json_encode & jquery parseJSON 单引号问题


php json_encode & jquery parseJSON single quote issue

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

我有一个带有 PHP 函数json_encode 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;

在这种情况下,谷歌浏览器控制台产生什么:

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中传递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手动输入示例 #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 常量

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

这在 PHP 字符串文字中对其进行了转义。然后将其作为简单的'插入到 PHP 字符串中。

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

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

var obj = <?=$data?>;

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

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

您面临的问题是,您将对 JavaScript 的json_encode调用的结果显示为字符串,而它是有效的 JavaScript。从输出中删除jQuery.jsonParse集,只需将回显结果分配给有问题的 JavaScript 变量即可。

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

看看它真的对我有帮助

$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);