使用Laravel Excel导入CSV时JSON字段引号转义多余斜杠问题求解
问题根源
CSV导入时Maatwebsite/Laravel-Excel默认会对包含逗号、双引号的字段(比如你这个JSON数组)按照CSV规范做二次转义:外层多套了一层双引号,JSON内部的双引号前也被自动插入了反斜杠做转义。你之前直接对未处理的原始导入值调用json_encode/json_decode,相当于把转义符也当成了内容的一部分处理,自然会新增更多斜杠。
解决方案
方案1:单字段手动清理(兼容性最好,不会影响其他字段解析)
在你的Import类的model方法或者prepareForValidation方法中,对JSON字段做如下处理:
public function model(array $row) { // 替换为你实际的JSON字段对应导入列名 $rawJson = $row['your_json_column']; // 第一步:去掉字段首尾多余的双层双引号 $cleanJson = trim($rawJson, '"'); // 第二步:去掉JSON内容里多余的转义反斜杠 $cleanJson = stripslashes($cleanJson); // 第三步:解码为数组,若模型已配置该字段为JSON cast,直接存数组即可 $formattedValue = json_decode($cleanJson, true); return new YourModel([ 'your_json_column' => $formattedValue, // 其他字段赋值 ]); }
方案2:全局调整CSV解析配置(适合CSV所有字段无默认引号包裹的场景)
在Import类中新增配置方法,关闭CSV默认的字段包裹符识别,避免自动添加多余转义:
use Maatwebsite\Excel\Concerns\WithCustomCsvSettings; class YourImport implements WithCustomCsvSettings { // 其他原有逻辑 public function getCsvSettings(): array { return [ // 将字段包裹符设为空,不再自动识别并转义带引号的字段 'enclosure' => '', ]; } }
处理完成后存入数据库的JSON字段就会和原始格式完全一致,不会再有多余转义符。
内容的提问来源于stack exchange,提问作者Hardist
相关产品推荐
相关产品推荐

