PHP解析嵌套格式错误的JSON中messages字段内容求助
解决PHP解析格式错误JSON消息的方案
步骤1:解析外层JSON,获取格式错误的messages字符串
先正常解码外层JSON,取出里面的messages字段值,这个值是格式有问题的JSON片段:
// 假设外层JSON内容已读取到$outerJson变量 $outerData = json_decode($outerJson, true); if (!isset($outerData['messages'])) { die('外层JSON中无messages字段'); } $brokenMessagesStr = $outerData['messages'];
步骤2:修复格式错误的消息字符串
因为消息对象之间仅用换行分隔,没有逗号且缺少数组包裹,通过正则处理补全格式:
// 匹配对象结束符+任意空白+对象开始符,替换为对象分隔逗号,再包裹成数组 $fixedMessagesStr = '[' . preg_replace('/}\s*{/', '},{', trim($brokenMessagesStr)) . ']';
这个正则会自动处理换行、空格等空白字符,给独立的JSON对象之间补上逗号,再用[]包裹成合法的JSON数组。
步骤3:解码修复后的JSON,提取所需字段
现在可以正常解码修复后的字符串,遍历提取role和content:
$messages = json_decode($fixedMessagesStr, true); if (json_last_error() !== JSON_ERROR_NONE) { die('修复后的JSON仍无法解码:' . json_last_error_msg()); } // 遍历输出每组消息的角色和内容 foreach ($messages as $msg) { if (isset($msg['role'], $msg['content'])) { echo '角色:' . $msg['role'] . ',内容:' . $msg['content'] . PHP_EOL; } }
特殊情况处理
如果原始错误字符串存在引号未转义、多余空白等问题,可以先执行以下预处理:
// 统一替换换行为空格,清理首尾空白 $brokenMessagesStr = trim(preg_replace('/\r\n|\r|\n/', ' ', $brokenMessagesStr));
内容的提问来源于stack exchange,提问作者bbunlock
相关产品推荐
相关产品推荐

