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

标签 php json php-7

我使用 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/

相关文章:

php - 如何从多维 PHP 数组中获取单个值

php - 在线 "diary"- 现有脚本/mysql/fwrite()?

json - 从传统的 Laravel/Rails 应用程序迁移到 React.js 生态系统。需要在前端进行数据管理

php - 自 PHP 5.3 以来 mysqli 扩展是否无处不在?

php - Laravel 是否支持 HHVM 版本 3.15.1 堆栈

php - 在 PHP 中显示 404 页面的正确方法?

php - 禁用日期选择器中的过去日期并仅选择 "monday"

json - 带有 JSON 嵌套数据的树面板

javascript - 如何将 ISO 8601 日期时间转换为字符串?

php - 无法通过 Docker 构建安装 PHP Zip 模块