我使用 json_decode()
的代码在 PHP 5.6 中正常工作。迁移到 PHP 7.0 后,json_decode()
返回 NULL 并且 json_last_error()
告诉我我的错误是:
Control character error, possibly incorrectly encoded
经过调试,我发现我的问题是字符串值中的制表符和换行符。如果我将它们都删除,它会起作用。如果我离开 新行 或 标签,就会发生错误。
json_decode()
行为在 PHP 7 中改变了吗?我想在我的 .json 文件中保留制表符和新行以提高可读性。如果我将制表符替换为\t 并将新行替换为\n,则代码有效。
如何保留新行和制表符?
最佳答案
由于软件许可问题,旧的 json
模块被替换为 jsond
模块。您可以查看此更改的讨论和随附的拉取请求 here .现在,关于更改或解决方法的信息不多,但我可以看到字符串 ([\0x00-\0x1F]
) 中的所有控制字符都会触发错误。不幸的是,根据 JSON Standard,这种行为似乎是正确的:
Insignificant whitespace is allowed before or after any token. The whitespace characters are: character tabulation (U+0009), line feed (U+000A), carriage return (U+000D), and space (U+0020). Whitespace is not allowed within any token, except that space is allowed in strings.
因此,换句话说,JSON 字符串中根本不允许文字制表符;它们必须是 \t
或 \u0009
。因此,您使用的 JSON 直接违反了标准。理想情况下,您应该让您的 JSON 源返回符合标准的 JSON。如果这不起作用,您必须预处理 JSON 并将字符串中的制表符转换为 \t
。
关于php - json_decode() 中的新行和制表符 (PHP 7),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34486346/