
PHP 的 json_encode() 严格遵循 JSON 规范,而标准 JSON 不允许字符串内出现未转义的原始换行符(即字面量 LF/CR); 总会被编码为转义序列 \n,这是合法且必需的行为,无法“显示为真实换行”——你所期望的格式本身不符合 JSON 语法。
php 的 `json_encode()` 严格遵循 json 规范,而标准 json 不允许字符串内出现未转义的原始换行符(即字面量 lf/cr);` ` 总会被编码为转义序列 `\n`,这是合法且必需的行为,无法“显示为真实换行”——你所期望的格式本身不符合 json 语法。
在开发中,常有人误以为 json_encode() 应该“渲染出带缩进换行的字符串内容”,例如希望以下代码:
$array = ["string" => "hello good morning!!"]; echo json_encode($array, JSON_PRETTY_PRINT);
输出类似这样的人类可读格式:
{
"string": "hello
good morning!!"
}⚠️ 但请注意:这并非合法 JSON。JSON 标准(ECMA-404)明确规定:字符串内的换行符必须以转义形式 " " 出现,不可作为裸字符(U+000A)直接嵌入字符串字面量中。否则,任何合规的 JSON 解析器(如 JavaScript JSON.parse()、Python json.loads()、或 PHP 自身的 json_decode())都会报错 SyntaxError: Unexpected token。
✅ 正确行为(符合标准):
$array = ["string" => "hello
good morning!!"];
echo json_encode($array);
// 输出:{"string":"hello
good morning!!"}
// 注意:这里的
是两个字符:反斜杠 + 字母 n,表示一个换行控制符✅ 若需提升可读性(如调试、日志),可启用 JSON_PRETTY_PRINT,但字符串内部仍保持转义:
echo json_encode($array, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
/*
{
"string": "hello
good morning!!"
}
*/? 验证解析安全性(关键!):
$encoded = json_encode($array);
$decoded = json_decode($encoded, true);
var_dump($decoded['string']); // string(19) "hello
// good morning!!"
// ✅ 换行语义完好保留:
在解码后还原为真实换行符? 补充说明:
- JSON_UNESCAPED_LINE_TERMINATORS(PHP 7.1+)仅影响 JSON 结构自身的换行分隔符(如对象花括号间的换行),不改变字符串内容的转义规则;
- 若你真正需要“在前端显示为多行”,应在消费端(如 JavaScript)用 <pre>、white-space: pre-line 或 .replace(/ /g, '<br>') 处理,而非修改 JSON 序列化格式;
- 强制拼接非标准 JSON(如用 str_replace 将 \n 替换为 )将导致数据不可解析,属于高危反模式。
? 总结:json_encode() 的行为完全正确且必要。 被转义为 \n 是 JSON 合规性的基石,确保跨语言、跨平台的数据互操作性。追求“视觉换行”应交由展示层处理,而非破坏序列化协议本身。


















