php json_encode创建未转义的新行操作符

时间:2016-12-15 15:31:54

标签: 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}

问题:

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

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

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

  

VM1628:1未捕获的SyntaxError:位于JSON中的意外标记   22       在JSON.parse()       at:1:6

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

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

1 个答案:

答案 0 :(得分:2)

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);