
PHP 中使用 json_encode() 处理含换行符的字符串时,若原始数据中存在未转义的 \n 或 \r\n,会导致生成的 JSON 不合法;启用 JSON_UNESCAPED_UNICODE 和 JSON_UNESCAPED_SLASHES 并配合预处理(如 str_replace 或 trim)可彻底解决该问题。
php 中使用 `json_encode()` 处理含换行符的字符串时,若原始数据中存在未转义的 `\n` 或 `\r\n`,会导致生成的 json 不合法;启用 `json_unescaped_unicode` 和 `json_unescaped_slashes` 并配合预处理(如 `str_replace` 或 `trim`)可彻底解决该问题。
你遇到的问题并非 json_encode() 本身出错,而是源数据中已包含未转义的换行符(\n)——例如 "PHP\nTutorial" 或 "PHP\nand MySQL\nDatabases"。当 PHP 对这类字符串执行 json_encode() 时,它默认不会自动转义换行符(除非显式启用 JSON_UNESCAPED_UNICODE 等标志),而 JSON 规范要求所有换行符必须被转义为 \n 才能构成合法 JSON 字符串。否则,生成的 JSON 将在换行处被截断,造成前端解析失败(SyntaxError: Unexpected token in JSON at position X)。
⚠️ 注意:JSON_PRETTY_PRINT 并不能修复非法换行!它只是美化输出格式(添加缩进和换行),但前提是输入数据本身已符合 JSON 语义。若原始字符串含裸换行(即未被转义的 \n),JSON_PRETTY_PRINT 只会让问题更明显(如将 "PHP\nTutorial" 渲染为多行文本),反而加剧解析错误。
✅ 正确解决方案分两步:
1. 清洗原始数据(推荐)
在 json_encode() 前,对所有字符串字段进行标准化处理,确保换行符被正确转义或移除:
function sanitizeArrayForJson($array) {
array_walk_recursive($array, function (&$value) {
if (is_string($value)) {
// 方案A:转义换行符(保留语义,推荐)
$value = str_replace(["\r\n", "\r", "\n"], '\n', $value);
// 方案B:删除换行符(适合标题等纯展示字段)
// $value = str_replace(["\r\n", "\r", "\n"], ' ', $value);
}
});
return $array;
}
$cleaned = sanitizeArrayForJson($yourArray);
$json = json_encode($cleaned, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
2. 使用安全的编码选项(增强兼容性)
避免默认行为引入不可见字符问题:
// 推荐组合:保留 Unicode、不转义斜杠、确保布尔/数字类型正确
$json = json_encode($cleaned,
JSON_UNESCAPED_UNICODE |
JSON_UNESCAPED_SLASHES |
JSON_NUMERIC_CHECK |
JSON_INVALID_UTF8_IGNORE // PHP 7.2+,跳过损坏 UTF-8 字节
);
? 补充说明:
- JSON_NUMERIC_CHECK 会将纯数字字符串(如 "44")转为整型 44,避免前端需手动 parseInt();
- 若使用 JSON_PRETTY_PRINT 仅用于调试,请仅在开发环境启用,生产环境禁用(增加传输体积且无实际修复作用);
- 检查数据来源(如数据库读取、用户输入、文件导入),在入库或接收阶段就过滤/转义换行符,比事后清洗更可靠。
✅ 最终验证方式:将 $json 输出至浏览器控制台或 Postman 的「Raw」视图,确认所有字符串中的换行均显示为 \n(而非真实换行),且整个响应体为单行合法 JSON —— 此时前端 JSON.parse() 即可成功执行。










