PHP json_encode编码数组多余换行导致JSON解析错误
问题根因
json_encode不会主动向字符串中插入换行符,异常换行的核心原因是待编码数组的字符串字段(尤其是title字段)本身就包含不可见的换行符(\n、\r或\r\n)。print_r输出数组内容时不会转义这类控制字符,会直接将换行符渲染为实际换行,视觉上和普通空格分隔的文本没有明显差异,因此前期排查时很难发现。
严格来说带转义换行符的JSON属于合法格式,但如果响应未正确声明JSON格式、或客户端解析逻辑对裸换行兼容不佳,就会出现Postman多行展示、前端解析报错的问题。
修复方案
按落地优先级选择操作即可:
- 编码前清洗数组内容
遍历数组,将所有字符串内的换行、回车符替换为普通空格,从根源移除异常字符:array_walk_recursive($array, function (&$value) { if (is_string($value)) { $value = str_replace(["\r\n", "\r", "\n"], ' ', trim($value)); } }); $json = json_encode($array, JSON_NUMERIC_CHECK); - 规范JSON响应输出逻辑
输出JSON前添加正确的响应头,告知客户端按JSON格式解析内容,避免文本模式下的渲染异常。注意该代码必须放在所有实际输出之前执行:header('Content-Type: application/json; charset=utf-8'); echo json_encode($array, JSON_NUMERIC_CHECK); exit; - 排查数据源过滤异常字符
检查数组数据的来源(数据库查询结果、接口接收参数、文件读取内容等),在数据入库、接收环节就做好非法控制字符过滤,避免异常数据流入后续业务流程。
如果执行完上述操作仍存在解析错误,调用json_last_error_msg()函数打印编码阶段的错误信息,定位是否存在非UTF-8字符、递归过深等其他问题:
$json = json_encode($array, JSON_NUMERIC_CHECK); if (json_last_error() !== JSON_ERROR_NONE) { var_dump(json_last_error_msg()); }
内容的提问来源于stack exchange,提问作者AbreQueVoy
相关产品推荐
相关产品推荐

