如何让json_decode处理无引号非法JSON值时不中断解析
原生PHP的json_decode严格遵循JSON规范,没有内置参数支持忽略非法值或自动修复无引号字符串格式,你可以通过以下几种方案解决问题:
方案1:正则预处理修复JSON格式
你给出的示例非法JSON存在两个问题:无引号的Soon值、salary对象末尾的多余逗号,二者均会导致解析失败,我们可以通过正则批量修复后再解析:
// 原始非法JSON字符串 $dirtyJson = '[ { "id": 1001, "title": "Test", "location": "London", "date": "2021-11-11", "duration": "", "salary": { "max": Soon, "min": Soon, } } ]'; // 第一步:移除所有尾部多余逗号 $cleanJson = preg_replace('/,\s*([\]}])/m', '$1', $dirtyJson); // 第二步:将冒号后无引号的非标准字面量(非数字、true、false、null)包裹为字符串 $cleanJson = preg_replace('/:\s*([A-Za-z_][A-Za-z0-9_]*)\s*(?=[,\]}])/', ': "$1"', $cleanJson); // 修复完成后可正常解析 $data = json_decode($cleanJson, true);
这种方案适合非法值格式比较统一的场景,性能较高无需额外依赖。
方案2:使用第三方宽松JSON解析库
如果数据源的非法格式比较多样,自己写正则容易遗漏边界情况,可以使用支持非严格JSON解析的第三方库,比如seld/jsonlint,它可以兼容处理无引号值、尾部逗号、注释等非标准JSON格式:
// 先通过composer安装依赖:composer require seld/jsonlint use Seld\JsonLint\JsonParser; $parser = new JsonParser(); // 传入宽松解析参数直接解析原始非法JSON $data = $parser->parse($dirtyJson, JsonParser::ALLOW_TRAILING_COMMA | JsonParser::ALLOW_UNQUOTED_STRINGS);
方案3:逐条目解析跳过非法数据
如果你不需要全量数据,只需要解析合法条目,可以先把feed数据按单条拆分,逐个调用json_decode解析,跳过返回null的非法条目即可。
内容的提问来源于stack exchange,提问作者nate
相关产品推荐
相关产品推荐

