PHP脚本json_encode转义斜杠问题及types数组格式适配咨询
问题分析
你的核心问题是在SQL中提前拼接带引号的字符串,再经json_encode处理时会被二次转义:因为json_encode会把字符串内的引号识别为普通字符进行转义,最终输出带\的结果,这完全不符合下游要求的JSON数组格式。
正确处理方案
不要在SQL层拼接JSON格式的字符串,推荐两种更可靠的处理方式:
方案1:SQL返回原始值,PHP端转换为数组
- 从数据库查询出未拼接的原始类型值(或把现有
[O,M,W]格式的字符串拆分为单个值) - 在PHP中将单个值存入数组,再赋值给
types字段,最后整体执行json_encode
示例代码:
// 假设从数据库获取的原始types字符串为 "[O,M,W]" $rawTypes = $row['types']; // 去除首尾方括号,按逗号分割为数组 $typesArray = explode(',', trim($rawTypes, '[]')); // 组装最终数据数组 $feedData[] = [ 'types' => $typesArray, // 其他字段... ]; // 生成标准JSON输出 echo json_encode($feedData);
这样输出的types就是下游需要的标准JSON数组["O","M","W"],不会出现转义问题。
方案2:利用数据库原生JSON函数生成合法数组(适用于MySQL 5.7+等支持JSON的数据库)
直接在SQL中生成合法的JSON数组,避免后续转义问题:
-- 直接生成固定值的JSON数组 SELECT JSON_ARRAY('O', 'M', 'W') AS types; -- 如果是从现有字段拼接,比如type1、type2、type3是表中列名 SELECT JSON_ARRAY(type1, type2, type3) AS types;
查询得到的types字段本身就是JSON类型,PHP取出后可直接作为数组处理(PDO可配置自动解析JSON),再执行json_encode即可得到正确结果。
为什么之前的方法无效?
你在SQL中生成带转义引号的字符串(如[\"O\",\"M\",\"W\"]),PHP拿到的是普通字符串,json_encode会对字符串内的所有特殊字符进行转义,最终输出会变成"[\"O\",\"M\",\"W\"]"——这是一个字符串类型的字段,而非下游需要的数组类型。JSON_UNESCAPED_SLASHES仅处理斜杠的转义,对引号无效,因此无法解决问题。
总结
优先选择上述两种方案,避免在SQL层提前拼接JSON格式字符串,让PHP或数据库原生处理为数组/JSON类型后再执行json_encode,即可得到符合要求的输出。
内容的提问来源于stack exchange,提问作者user23825044
相关产品推荐
相关产品推荐

