【问题标题】:json_encode with double quotes passed into JSON.parse带双引号的 json_encode 传递到 JSON.parse
【发布时间】: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


【解决方案1】:

由于 json 可以直接用作 javascript 中的对象字面量,因此您可以这样使用它:

var decoded = <?php echo $jsonData ; ?>;

因此无需进行任何进一步的解析以避免文本中出现'\ 字符的问题。 json_encode 应该已经处理了 " 字符。

【讨论】:

  • 哇,这真的很简单。我确实有点惭愧:) 谢谢! :)
  • 最后,11 分钟过去了,我可以接受你的回答 :)
  • 哦,我没有意识到这对于拥有更多代表的用户来说仍然是一件事情。
  • 我也不是。显然是:)
猜你喜欢
  • 1970-01-01
  • 2017-02-26
  • 1970-01-01
  • 2019-02-15
  • 2010-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多