
本文介绍在 php 中处理格式严重损坏的“伪 json”文件(如缺少开头/结尾方括号、键名缺引号、对象间无分隔符)的实用解析策略,通过字符串预处理将其转化为标准 json,再用 json_decode() 安全解析。
本文介绍在 php 中处理格式严重损坏的“伪 json”文件(如缺少开头/结尾方括号、键名缺引号、对象间无分隔符)的实用解析策略,通过字符串预处理将其转化为标准 json,再用 json_decode() 安全解析。
当面对非标准文本数据时——例如您提供的文件内容:
{timestamp":"2022-03-25 00:25:41.476+00","order_id":"1659616"}{timestamp":"2022-03-25 00:18:51.892+00","order_id":"1560808"}{timestamp":"2022-03-25 00:23:52.267+00","order_id":"1727305"}它看似 JSON,实则存在多个致命语法错误:
- 所有键名(如 timestamp)缺失左引号,变成 timestamp";
- 多个 JSON 对象连续拼接,中间无逗号、无换行、无分隔符(即 }{ 直连);
- 整体既非单个 JSON 对象,也非 JSON 数组,json_decode() 会直接返回 null。
✅ 正确思路不是强行逐字符解析,而是先修复结构,再交由原生 JSON 解析器处理——这更可靠、可维护,且避免正则误匹配等风险。
三步标准化预处理
以下代码将原始文件内容转换为合法 JSON 数组字符串:
立即学习“PHP免费学习笔记(深入)”;
// 1. 读取整个文件内容(注意:file() 按行读取但此处无换行,故需合并)
$content = file_get_contents('abovefile.txt'); // 更简洁可靠,替代 foreach(file() as $line)
// 2. 修复键名引号:将所有 'xxx":' → '"xxx":'
$content = preg_replace('/({|,)\s*([a-zA-Z_][a-zA-Z0-9_]*)":/', '$1"$2":', $content);
// 3. 插入数组结构 + 分隔符:将 '}{' 替换为 '}, {'
$validJson = '[' . str_replace('}{', '}, {', $content) . ']';
// 4. 解析(带错误检查)
$data = json_decode($validJson, true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new RuntimeException('JSON 解析失败: ' . json_last_error_msg());
}
// 5. 安全遍历结果
foreach ($data as $item) {
echo "时间: {$item['timestamp']}, 订单ID: {$item['order_id']}\n";
}? 关键说明:
- 使用 file_get_contents() 替代 file() + foreach,因原始文件无换行符,file() 会返回仅含一个元素的数组,反而冗余;
- preg_replace() 精准修复键名引号(比简单 str_replace('timestamp"', '"timestamp"') 更通用,适配任意合法键名);
- str_replace('}{', '}, {') 假设对象间严格以 }{ 相连(无空格),若存在空格或换行,建议先 preg_replace('/}\s*{/', '}, {', $content);
- 务必校验 json_decode() 结果:json_last_error() 是识别预处理失败的唯一可靠方式。
⚠️ 注意事项与健壮性建议
- 不要信任输入:该方案假设所有对象结构一致(仅含 timestamp 和 order_id)。若字段动态变化,应在解析后做 isset() 或 array_key_exists() 检查;
- 大文件慎用内存:file_get_contents() 将全文载入内存。若文件超几十 MB,需改用流式处理(如逐块读取 + 缓冲区状态机匹配 {/}),但复杂度显著上升;
- 时间戳格式兼容性:示例中 2022-03-25 00:25:41.476+00 符合 ISO 8601,PHP DateTime 可直接解析,无需额外处理;
- 生产环境加固:建议封装为函数,并加入日志记录解析前后样本、失败行号(可通过 mb_substr() 截取错误位置上下文)。
通过结构化预处理 + 原生 JSON 解析,您既能保持代码简洁性,又能获得 PHP JSON 扩展的全部健壮性保障——这才是处理“坏 JSON”的专业之道。











