如何解决使用 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;
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-1
、var_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 举报,一经查实,本站将立刻删除。