Laravel中json_decode解析后字符串多引号致explode失败求助
问题解决:Laravel读取JSON后choices字段带额外引号导致explode失败
问题还原
在Laravel中从数据库读取JSON格式的字段$field['options'],执行以下代码时,发现解析后的$options['choices']被添加了额外引号,导致explode无法正常拆分内容:
$options = json_decode($field['options'],true); $rows = explode('\n', $options['choices']); dd($field['options'],$options,$rows,'here');
已知原始$field['options']是格式正确的JSON字符串。
原因分析
这种情况通常是因为数据库中存储的JSON里,choices字段的值本身是被转义的字符串(相当于双层JSON结构)。比如原始JSON可能是类似这样:
{"choices": "\"选项1\\n选项2\\n选项3\""}
第一次json_decode后,$options['choices']会变成带首尾引号的字符串:"选项1\n选项2\n选项3",而非预期的纯换行分隔字符串。另外,代码中使用explode('\n', ...)是用单引号包裹换行符,这会把'\n'当作字面量字符(反斜杠+n),而非实际的换行符,也是拆分失败的诱因之一。
解决方案
方案1:修复数据存储逻辑(推荐)
确保存入数据库的JSON中,choices字段直接存储为未被转义的换行分隔字符串,正确的JSON格式应该是:
{"choices": "选项1\n选项2\n选项3"}
之后修改代码中explode的换行符为双引号包裹:
$options = json_decode($field['options'], true); $rows = explode("\n", $options['choices']);
方案2:针对已存储的错误数据做二次解析
如果数据库中已经存了带转义的choices值,可以对$options['choices']做二次JSON解码,再拆分:
$options = json_decode($field['options'], true); // 二次解码choices字段,去除额外引号并解析转义字符 $choices = json_decode($options['choices'], true) ?? $options['choices']; // 用双引号的换行符拆分 $rows = is_string($choices) ? explode("\n", $choices) : [];
内容的提问来源于stack exchange,提问作者Alex Rhodes
相关产品推荐
相关产品推荐

