json_decode() (PHP 7) 中的新行和标签

Posted

技术标签:

【中文标题】json_decode() (PHP 7) 中的新行和标签【英文标题】:New lines and tabs in json_decode() (PHP 7) 【发布时间】:2016-04-01 21:06:12 【问题描述】:

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

控制字符错误,可能编码不正确

经过调试,我发现我的问题是字符串值中的制表符和换行符。如果我将它们都删除,它会起作用。如果我离开 任一 新行 选项卡,则会发生错误。

json_decode() 的行为在 PHP 7 中是否发生了变化?我想在我的 .json 文件中保留制表符和换行符以提高可读性。如果我将制表符替换为 \t 并将新行替换为 \n,则该代码有效。

如何保留新的行和标签?

【问题讨论】:

【参考方案1】:

也许是这样?

$str = bin2hex('Text with special character /\"\'\b\f\t\r\n.'); // Convert binary data into hexadecimal representation
$arr = array("Some text", "Some text 2", $str);
$Json = json_encode($arr); // Now we are ready to send the json data

这里我们将检索json数据

$arr_2 = json_decode($Json, true);
echo $arr_2[0];
echo $arr_2[1];
echo hex2bin($arr_2[2]);//Decodes a hexadecimally encoded binary string

【讨论】:

【参考方案2】:

我在换行时遇到了同样的问题,我无法修改收到的字符串。我需要使用它,我的诀窍是检测新行并再次重写它,'字面意思'!:

之前:

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!

【讨论】:

我的想法和你的想法一样,因为你已经做了实验,我得到了必要的信心。谢谢:) 谢谢您,先生,您为我节省了很多时间。【参考方案3】:

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

【讨论】:

我是否正确理解 PHP 7 决定对 JSON 标准更加严格?如果是这样,我认为这很好。你认为我应该为了遵循 JSON 标准而牺牲可读性吗?最后,为什么 JSON 不支持在文本编辑器中看到的新行和标签? @Robo Robok:您仍然可以在 JSON 文档中使用制表符和换行符,但如果不对它们进行编码,它们本身就不能出现在字符串中。 是的,他们让它更符合标准,是的,你绝对应该牺牲可读性来使用符合标准的 JSON :) 感谢您的精彩回答。我会选择威尔的答案,因为它包含更多细节。我希望你不要介意! :)【参考方案4】:

由于软件许可问题,旧的 json 模块已替换为 jsond 模块。您可以查看有关此更改的讨论以及附加的拉取请求 here。现在,关于更改或解决方法的信息并不多,但我可以看到字符串 ([\0x00-\0x1F]) 中的所有控制字符都会触发错误。不幸的是,根据JSON Standard,这种行为似乎是正确的:

在任何标记之前或之后都允许有无关紧要的空格。空白字符有:字符制表符(U+0009)、换行符(U+000A)、回车符(U+000D)和空格符(U+0020)。任何标记中都不允许有空格,但字符串中允许有空格。

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

【讨论】:

很棒的工作,伙计们。非常感谢您启发我。

以上是关于json_decode() (PHP 7) 中的新行和标签的主要内容,如果未能解决你的问题,请参考以下文章

php中的json_encode()和json_decode()函数的一些说明

php请求url返回json数据的问题

PHP json_decode 用法

如何在 PHP 中解决“调用未定义函数 Composer\Json\json_decode()”?

php中json_decode()和json_encode()的使用方法

PHP中json_decode()和json_encode()的使用方法