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

New lines and tabs in json_decode() (PHP 7)

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

Control character error, possibly incorrectly encoded

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

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

如何保留新行和制表符?

根据 RFC 7159. Therefore, whatever program you used to encode has encoded a non-standard form of JSON. Unfortunately, json_decode 的唯一选项 JSON_BIGINT_AS_STRING,JSON 的字符串中不允许使用未编码的制表符和换行符,在这种情况下无济于事。

由于软件许可问题,旧的 json 模块已替换为 jsond 模块。你可以看到这个变化的讨论和附加的拉取请求 here. Now, there's not much information about the changes or about workarounds for things, but I can see that all control characters inside strings ([[=12=]x00-[=12=]x1F]) trigger an error. Unfortunately for you, it seems that this behavior is correct per the 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 来源符合 return 标准 JSON。如果这不起作用,您必须预处理 JSON 并将字符串中的制表符转换为 \t.

我在换行时遇到了同样的问题,我无法修改收到的字符串。我需要使用它,我的技巧是检测新行并再次重写,'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!

也许是这样?

$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