You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 10读取存储JSON文件时\n\r转义序列部分未转义问题

问题分析与解决方案

这不是Laravel Bug,是响应头设置不当或文件内容处理逻辑的问题,原因如下:

  • 直接访问public目录的JSON文件时,Web服务器(Nginx/Apache)会自动识别文件类型,返回Content-Type: application/json响应头,浏览器会将内容作为JSON格式原样展示,保留转义序列。
  • 通过Laravel路由直接返回字符串时,框架默认设置Content-Type: text/html,浏览器会将内容中的真实换行符解析为页面换行;同时如果文件内容本身存在未正确转义的换行(即真实换行而非\n转义符),也会导致JSON格式错乱。

解决步骤

1. 强制设置响应头为JSON类型

修改路由代码,返回时指定Content-Type为application/json,让浏览器正确识别JSON格式:

Route::get('/demo/{filename}', function ($filename) {
    $filePath = Storage::path("public/demo/".$filename);
    \Log::info('file '.$filePath);
   
    if (file_exists($filePath)) {
        $json = file_get_contents($filePath); 
        \Log::info($json);
        // 设置正确的响应头并返回
        return response($json, 200, ['Content-Type' => 'application/json']);
    } else {
        return view('welcome'); 
    }
});

2. 确保JSON文件内容有效

检查storage目录下的JSON文件,确保字符串中的换行是以\n(反斜杠+字母n)的转义形式存在,而非真实的换行符。如果文件是通过代码生成的,使用json_encode正确生成JSON:

$data = [
    'html' => '<!DOCTYPE html>
<html><head><meta charset="UTF-8"></head><body>
<p style="vertical-align:middle;font-size:2em;" >
test
</p></body></html>'
];
// 生成正确转义的JSON,JSON_UNESCAPED_SLASHES避免斜杠被额外转义
$json = json_encode($data, JSON_UNESCAPED_SLASHES);
Storage::put('public/demo/your-file.json', $json);

3. 修复已存在的无效JSON文件

如果文件已存在且内容包含真实换行(无效JSON),可以读取后重新转义或编码:

if (file_exists($filePath)) {
    $content = file_get_contents($filePath);
    try {
        // 尝试解码后重新编码,自动修复转义
        $data = json_decode($content, true);
        $json = json_encode($data, JSON_UNESCAPED_SLASHES);
    } catch (\Exception $e) {
        // 解码失败时手动替换真实换行为转义序列
        $json = str_replace(["\n", "\r"], ["\\n", "\\r"], $content);
    }
    return response($json, 200, ['Content-Type' => 'application/json']);
}

内容的提问来源于stack exchange,提问作者P5music

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 09:54:55