【发布时间】:2014-10-31 06:39:45
【问题描述】:
我正在尝试在 PHP 中构建一个大型 JSON 字符串,然后将其回显到客户端,例如 this。我的问题是 PHP 函数 json_encode 没有正确转义用于 javascript 的字符。
这是我的数据:
my_table
------------------------------------------------------------------
| title | description |
------------------------------------------------------------------
| Something's "Fun" | Hello[invisible carriage return char]World |
------------------------------------------------------------------
这些数据中有三个字符需要转义:单引号、双引号和回车符。
这是我将数据转换为 json 的 php(在我将数据放入对象之后):
$array = array(
'title' => obj->title,
'desc' => obj->description
);
$json = json_encode($array);
然后,我将带有“正确”转义字符的 json 字符串从我的视图中回显到客户端,如下所示:
<script>
var jsonString = '<?php echo $json; ?>';
var obj = JSON.parse(jsonString);
</script>
但是当页面加载时,我的浏览器 (Chrome) 会推送“意外标识符”错误,因为这是脚本标签的实际外观:
<script>
var jsonString = '{"title":"Something's \"Fun\"","desc":"Hello\nWorld"}';
var obj = JSON.parse(jsonString);
</script>
从 js 的角度来看,双引号是唯一正确转义的。单引号根本没有转义,js 在 \n 处吓坏了。
顺便说一句:手动转义单引号不起作用。而且我不知道如何处理 \n 才能让 js 识别它。
【问题讨论】:
-
json_encode应该已经返回了一个有效的 JavaScript 对象字面量,因此无需再次解析它。 -
为什么要将 JSON 输出重新包装在一个字符串中,然后再次解析它? (如果你真的必须:应用 json_encode 两次,而不是自己添加引号。)
-
[手掌到额头] @Gumbo,你是对的!不知道我在想什么。我想有那么一刻我脑筋急转弯并忘记了 json 已经被写成一个 js 对象——这就是重点。 [再次手掌到额头] 发布这个答案,我会接受。
-
@mario 你的评论听起来也不错。
-
没有人想发表答案?
标签: javascript php json escaping