json_decode()中的新行和制表符(PHP 7)

时间:2015-12-28 00:33:27

标签: php json php-7

使用json_decode()的代码在PHP 5.6中正常运行。迁移到PHP 7.0后,json_decode()返回NULL,json_last_error()告诉我我的错误是:

  

控制字符错误,可能编码错误

调试后,我发现我的问题是字符串值中的制表符和换行符。如果我将它们都删除,它就可以了。如果我离开 新行标签,则会发生错误。

PHP 7中的json_decode()行为是否已更改?我想在我的.json文件中保留标签和新行,以提高可读性。如果我将标签替换为\ t并将新行替换为\ n。

,则代码可以正常工作

如何保留新的行和标签?

3 个答案:

答案 0 :(得分:10)

由于软件许可问题,旧的json模块已替换为jsond模块。您可以查看此更改的讨论以及附加的提取请求here。现在,关于事物的变化或变通方法的信息不多,但我可以看到字符串([\0x00-\0x1F])内的所有控制字符都会触发错误。不幸的是,根据JSON Standard

,这种行为似乎是正确的
  

任何令牌之前或之后都允许使用无关紧要的空格。空白字符为:字符列表(U + 0009),换行符(U + 000A),回车符(U + 000D)和空格(U + 0020)。除了字符串中允许使用空格外,不允许在任何标记内使用空格。

因此,换句话说,JSON字符串中根本不允许使用文字制表符;它们必须是\t\u0009。因此,您消耗的JSON直接违反了标准。理想情况下,您应该获取JSON源以返回符合标准的JSON。如果这不起作用,您必须预先处理JSON并将字符串中的标签转换为\t

答案 1 :(得分:4)

根据RFC 7159,JSON中的字符串中不允许使用未编码的制表符和换行符。因此,您用于编码的任何程序都编码了非标准形式的JSON。不幸的是,json_decode唯一的选择JSON_BIGINT_AS_STRING在这种情况下无济于事。

答案 2 :(得分:1)

我在换行时遇到了同样的问题,我无法修改收到的字符串。我需要使用它,而我的窍门是检测新行并再次将其重写,“ literaly”!:

之前:

echo json_decode($json); // error JSON_ERROR_CTRL_CHAR

之后:

$json = str_replace("\r\n", '\r\n', $json); // single quotes do the trick
echo json_decode($json); // works!