【发布时间】:2016-02-28 21:30:30
【问题描述】:
我看到这些年来这个问题被问了太多次了。仍然忍不住询问在此期间是否有任何改进。
目前,我有 PHP 代码:
$jsonData = json_encode($data, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT);
然后 JS(具体来说是 Angular)开始发挥作用:
var decoded = angular.fromJson('<?php echo $jsonData ; ?>');
上面的标志很好地解决了一些问题。但是,举个例子:
$data = ["name" => "Name \"Nickname\" Surname"];
JSON 解析失败。如果我用addslashes() 包装数据,它确实有效,但是:
$data = ["name" => "Name 'Nickname' Surname"];
这失败了。
由于结构$data 是高度不可预测的,通常是4-5 层深,我的解决方案是:
array_walk_recursive($data, function(&$item, $key){
$item = str_replace('"', '\"', $item);
});
这可行,但是,我正在寻找一些更有知识的来源。我读过其他一些 SO 问题,人们不仅逃避双引号,还逃避换行、回车和反斜杠。
我需要做的最后一件事就是陷入极端情况陷阱:)
有什么提示吗?
【问题讨论】:
-
用斜杠转义会给您带来麻烦,因为当您将其放在 javascript 文件中的另一个字符串中时,斜杠会在 将其发送到 JSON.parse 之前转义引号,从而导致无效的json。斜杠和引号都需要转义才能正常工作。例如,
{"name": "Name \\"Nickname\\" Surname"}将被 javascript 解释为"{"name": "Name \"Nickname\" Surname"}",这是一个有效的 json 字符串。
标签: javascript php angularjs json