
本文介绍在 PHP 中处理缺失方括号、缺少引号、无换行分隔的非法 JSON 文本(如连续 {...}{...}{...})的实用解析方法,通过字符串预处理 + json_decode() 实现健壮转换。
本文介绍在 php 中处理缺失方括号、缺少引号、无换行分隔的非法 json 文本(如连续 `{...}{...}{...}`)的实用解析方法,通过字符串预处理 + `json_decode()` 实现健壮转换。
当面对非标准 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"}该文本存在三类典型问题:
- 键名 timestamp 和 order_id 缺少起始双引号(应为 "timestamp");
- 相邻对象间无分隔符(}{ 应转为 }, {);
- 整体缺少 JSON 数组外壳(需包裹为 [...])。
✅ 推荐预处理流程如下(完整可运行代码):
<?php
// 读取整个文件内容(注意:file() 按行读取不适用,因无换行)
$content = file_get_contents('abovefile.txt');
// 步骤 1:修复键名引号缺失(仅修复开头无引号的键,避免误伤值中的冒号)
$content = preg_replace('/\{([^"])/', '{"$1', $content); // 补左花括号后首个非引号字符前的 "
// 步骤 2:将 }{ 替换为 }, {(实现对象间合法分隔)
$content = str_replace('}{', '}, {', $content);
// 步骤 3:包裹为 JSON 数组
$jsonArray = '[' . $content . ']';
// 步骤 4:解码并验证
$data = json_decode($jsonArray, true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new RuntimeException('JSON 解析失败:' . json_last_error_msg());
}
// 输出结果
foreach ($data as $item) {
echo "Timestamp: {$item['timestamp']}, Order ID: {$item['order_id']}\n";
}
?>⚠️ 关键注意事项:
立即学习“PHP免费学习笔记(深入)”;
- file() 函数按行读取在此场景不适用(原文本无换行),必须使用 file_get_contents() 一次性加载全文;
- str_replace('timestamp"', '"timestamp"') 虽简单,但有风险:若 order_id 值中含 timestamp" 将被误改;推荐用 preg_replace() 精准匹配键位置;
- 若文件极大(>10MB),需改用流式处理(如逐块读取 + 正则缓冲解析),避免内存溢出;
- 生产环境建议添加容错逻辑:跳过无法修复的片段,并记录警告日志。
? 进阶建议:对于长期维护的系统,应推动上游输出合法 JSON(RFC 8259 标准),或约定以 NDJSON(每行一个 JSON 对象)格式交付,从根本上规避此类问题。临时修复方案务必配合单元测试覆盖边界用例(如空字段、嵌套引号、特殊时区符号等)。











