You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 23:54:03