javascript - php json_encode 创建未转义的换行符

标签 javascript php arrays json

这是我的 php:

$response = array(
    'errors' => $this->errors,
    'orders_fulfilled' => $this->orders_fulfilled,
);
echo '<pre>$response: ' . print_r($response, true) . '</pre>';

$json = json_encode($response, JSON_HEX_APOS);
echo '<pre>$json: ' . print_r($json, true) . '</pre>';

这显示了以下输出:

$response: Array
(
    [errors] => Array
        (
            [0] => Error text

        )

    [orders_fulfilled] => 0
)

$json: {"errors":["Error text\n"],"orders_fulfilled":0}

问题:

当它们在 json 字符串中无效时,为什么 php 的 json_encode() 会从源 php 数组中的实际换行符中创建未转义的 \n 字符?

I see in this accepted answer建议是转义源换行符,即从 \n 转换为 \\n。那么为什么 PHP 的 json_encode() 不应该在这里这样做呢?就目前情况而言,它是直接创建一个 json 字符串,该字符串会阻塞 javascript 中的 JSON.Parse() 。例如,尝试在控制台中运行此命令:

JSON.parse('{"errors":["错误文本\n"],"orders_fulfilled":0}');

VM1628:1 Uncaught SyntaxError: Unexpected token in JSON at position 22 at JSON.parse () at :1:6

如果我添加斜杠来转义换行符或将其完全删除,错误就会消失。

是否有一个 json_encode() 标志,我应该使用它来处理特殊/控制字符的转义,这是我在 PHP 手册中没有看到的?

最佳答案

json_encode 的输出没问题。

问题是,当您尝试通过用 ' 包装将其转换为 JavaScript 字符串文字时,\n 会被解析为新行在 JS 字符串中

当您尝试将该字符串解析为 JSON 时,它会包含一个真正的新行。

要转换为 JavaScript 字符串,您还必须转义其中的所有特殊字符。

由于 JSON(或多或少)是 JavaScript 的子集,因此 json_encode 将执行此操作:

var json = <?php json_encode(json_encode($foo)); ?>;
var obj = JSON.parse(json);
console.log(obj);

……但这是一个愚蠢的方法。

只需跳过将其视为 JSON 的部分,而将其视为 JavaScript。

var obj = <?php json_encode($foo); ?>;
console.log(obj);

关于javascript - php json_encode 创建未转义的换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41167834/

相关文章:

javascript - 按顺序处理文件内容

php - 说表不存在

foreach 循环中的 php key() 奇怪行为或获取 foreach 循环中的下一个键

php - 如何通过PHP发送POST数据

java - 执行所有 M 操作后数组中的最大元素

c# - 具有字符串字段(或字节数组)(非值类型)的 .NET 结构是否可以提高内存效率?

javascript - 如果一个数组的所有项目存在于另一个数组中,则将其删除

javascript - 如何通过 AngularJS $http 从 ASP.Net Web API 2 获取访问 token ?

javascript - 搜索和替换旧背景颜色

javascript - 谷歌可视化表allowHtml选项在谷歌网站上不起作用