使用json_decode()
的代码在PHP 5.6中正常运行。迁移到PHP 7.0后,json_decode()
返回NULL,json_last_error()
告诉我我的错误是:
控制字符错误,可能编码错误
调试后,我发现我的问题是字符串值中的制表符和换行符。如果我将它们都删除,它就可以了。如果我离开 新行或标签,则会发生错误。
PHP 7中的json_decode()
行为是否已更改?我想在我的.json文件中保留标签和新行,以提高可读性。如果我将标签替换为\ t并将新行替换为\ n。
如何保留新的行和标签?
答案 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!