PHP生成含HTML的JSON payload报错问题求助
以下是可能导致你的payload JSON格式化失败的核心问题及排查方案:
HTML内容的特殊字符未正确处理
HTML中的双引号"、反斜杠\、换行符或未闭合标签,会直接破坏JSON的语法结构。比如生成的HTML包含<div class="patient-box">,如果json_encode时未正确转义双引号,会导致JSON的键值对引号冲突。
排查:直接输出cardata字段内容,检查是否有未转义的特殊字符;可启用参数强制转义:$payload = json_encode($data, JSON_HEX_QUOT | JSON_HEX_TAG);数据库编码与PHP编码不匹配
若数据库字段编码不是UTF-8,取出的cardata可能包含乱码或非法UTF-8字符,导致json_encode生成无效JSON甚至返回false。
排查:用mb_check_encoding($dbResult['cardata'], 'UTF-8')验证编码;确保数据库连接、表字段编码均为utf8mb4。手动拼接JSON字符串的语法错误
如果你是手动拼接包含entities键的payload(而非通过PHP数组转JSON),极容易出现引号不匹配、逗号遗漏或结构错误。
正确做法:始终通过数组构造结构再转JSON,避免手动拼接:// 构造完整数据结构 $payloadData = [ 'entities' => [ [ 'cardata' => $dbResult['cardata'], // 其他必要字段 ] ] ]; $payload = json_encode($payloadData, JSON_UNESCAPED_UNICODE);HTML包含JSON禁止的控制字符
patient_file()生成的HTML可能包含ASCII控制字符(如\x00-\x1F),这类字符不允许出现在JSON中,会导致格式化工具报错。
排查:用正则过滤控制字符:$cleanCardata = preg_replace('/[\x00-\x1F\x7F]/u', '', $dbResult['cardata']);json_encode执行失败未被捕获
直接输出json_encode的结果前,先检查是否生成失败:$payload = json_encode($payloadData); if ($payload === false) { die(json_last_error_msg()); // 输出具体错误信息,如"Malformed UTF-8 characters" }
内容的提问来源于stack exchange,提问作者Salum Said

