微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 PHP v8,如何让 json_decode 长时间工作但经过验证的 (JSONLINT) json 字符串?

如何解决使用 PHP v8,如何让 json_decode 长时间工作但经过验证的 (JSONLINT) json 字符串?

我去了 jsonlint,这个 json 字符串报告为有效:

-stackoverflow- truncated,length is over 153,515 characters,see below

似乎有几个嵌套的json子对象。它也有一些内部单引号

在 Windows 10 上,从 CLI 运行 PHP

$ PHP -v
PHP 8.0.1 (cli) (built: Jan  5 2021 23:43:39) ( ZTS Visual C++ 2019 x64 )
copyright (c) The PHP Group
Zend Engine v4.0.1,copyright (c) Zend Technologies

可以直接运行代码查看错误如下:

$raw = file_get_contents("http://md5.mshaffer.com/WSU_STATS419/stackoverflow/json_decode/error.json");
$try = json_decode($raw,true);
var_dump($try);
exit;

这是一个漂亮的json形式的链接,由jsonlint验证

http://md5.mshaffer.com/WSU_STATS419/stackoverflow/json_decode/jsonlint.json

这是 base64_encoded 表单的链接

http://md5.mshaffer.com/WSU_STATS419/stackoverflow/json_decode/error.b64

解决方法

您的链接的 JSON 无效,因为它包含非 UTF-8 字符。

我建议您将标志 JSON_THROW_ON_ERROR (PHP >= 7.3) 添加到 json_decode,或者测试 json_last_error 的输出,这样您就知道发生了什么。>

$raw = file_get_contents("http://md5.mshaffer.com/WSU_STATS419/stackoverflow/json_decode/error.json");
$try = json_decode($raw,true);
var_dump(json_last_error() === JSON_ERROR_UTF8);
# bool(true)

您可以添加 JSON_INVALID_UTF8_IGNORE (PHP >= 7.2) 以去除违规字符:

$try = json_decode($raw,true,512,JSON_INVALID_UTF8_IGNORE);
var_dump($try);
# array(40) { ["maxLevel"]=> ...

但这几乎不是你想做的事情,除非万不得已。


稍微调查一下,违规字符是é的{​​{1}}、Denucé的{​​{1}}和ç的{​​{1}}。你的字符串感觉像 Curaçao:

ä

正如 @IMSoP 所指出的,Städel 无法区分 ISO-8859-1var_dump(mb_check_encoding($raw,'UTF-8')); # bool(false) var_dump(mb_check_encoding($raw,'ISO-8859-1')); # bool(true) mb_check_encoding 或任何单字节编码。

以下解决方法将在解析 JSON 之前正确地将此特定字符串转换为 ISO-8859-1

Windows 1252

但是,请认真修复上游完成的 JSON 生成,使其有效 ISO-8859-1

旁注:由于 UTF-8 不检查整个字符串,因此不可靠。它会“说”你的字符串是 $raw = iconv('ISO-8859-1','UTF-8',$raw); $try = json_decode($raw,JSON_THROW_ON_ERROR); var_dump($try); # array(40) { ["maxLevel"]=> ... ,这里不是这种情况。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。