商城首页欢迎来到中国正版软件门户

您的位置:首页 >无换行JSON解析技巧(PHP教程)

无换行JSON解析技巧(PHP教程)

  发布于2026-04-18 阅读(0)

扫一扫,手机访问

如何安全解析无换行、缺失引号的类 JSON 文本文件(PHP 教程)

本文介绍在 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 数组字符串:

// 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”的专业之道。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注