php json_encode 创建未转义的换行符

ajm*_*way 0 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>';
Run Code Online (Sandbox Code Playgroud)

这显示了以下输出:

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

        )

    [orders_fulfilled] => 0
)

$json: {"errors":["Error text\n"],"orders_fulfilled":0}
Run Code Online (Sandbox Code Playgroud)

题:

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

我在此接受的答案看到的建议是为了躲避源换行,即从转换\n\\n。那么为什么 PHPjson_encode()不应该在这里这样做呢?就目前而言,它直接创建了一个JSON.Parse()在 javascript中阻塞的 json 字符串。例如,尝试在控制台中运行它:

JSON.parse('{"errors":["Error text\n"],"orders_fulfilled":0}');

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

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

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

Que*_*tin 5

的输出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);
Run Code Online (Sandbox Code Playgroud)

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

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

var obj = <?php json_encode($foo); ?>;
console.log(obj);
Run Code Online (Sandbox Code Playgroud)

  • `\n` 在 JavaScript 字符串中有效。`\n` 在 JSON 字符串中有效。作为 JavaScript 字符串的 JSON 字符串表达式中的 `\n` 将在 JSON 字符串中放置一个新行。新行在 JSON 字符串中无效。要查看此运行 `'{"errors":["Error text\n"],"orders_fulfilled":0}'` 直接在浏览器的 JS 控制台中。然后将结果(包括换行符)复制到 JSON Lint 中。 (2认同)