PHP的json_encode不会转义所有JSON控制字符

Gus*_*tav 26 php json

PHP的json_encode函数是否有任何原因无法转义字符串中的所有JSON控制字符?

例如,让我们取一个跨越两行的字符串,并在其中包含控制字符(\ r \n"/ \"):

<?php
$s = <<<END
First row.
Second row w/ "double quotes" and backslash: \.
END;

$s = json_encode($s);
echo $s;
// Will output: "First row.\r\nSecond row w\/ \"double quotes\" and backslash: \\."
?>
Run Code Online (Sandbox Code Playgroud)

请注意,回车符和换行符未转义.为什么?

我正在使用jQuery作为我的JS库,它的$ .getJSON()函数将完全正常,100%信任传入数据.否则我像其他人一样使用JSON.org的库json2.js.但是,如果您尝试解析该编码的字符串,则会引发错误:

<script type="text/javascript">

JSON.parse(<?php echo $s ?>);  // Will throw SyntaxError 

</script>
Run Code Online (Sandbox Code Playgroud)

你无法获得数据!如果删除或转义该字符串中的\ r \n"和\",则JSON.parse()不会抛出错误.

是否有任何现有的,良好的PHP函数用于转义控制字符.使用搜索和替换数组的简单str_replace将不起作用.

小智 29

function escapeJsonString($value) {
    # list from www.json.org: (\b backspace, \f formfeed)    
    $escapers =     array("\\",     "/",   "\"",  "\n",  "\r",  "\t", "\x08", "\x0c");
    $replacements = array("\\\\", "\\/", "\\\"", "\\n", "\\r", "\\t",  "\\f",  "\\b");
    $result = str_replace($escapers, $replacements, $value);
    return $result;
  }
Run Code Online (Sandbox Code Playgroud)

我正在使用上面的函数来逃避反斜杠(必须是数组中的第一个)并且应该处理换页和退格(我不认为\f并且\b在PHP中受支持).


Gre*_*reg 12

D'哦 - 你需要进行双重编码:JSON.parse期待一个字符串:

<script type="text/javascript">

JSON.parse(<?php echo json_encode($s) ?>);

</script>
Run Code Online (Sandbox Code Playgroud)

  • 不,转义的换行符是"\n".未转义的新行将是一条新行. (2认同)