MariaDB使用JSON_ARRAYAGG生成JSON时双引号转义错误,如何修正?
解决JSON生成时双引号转义异常的问题
我之前也踩过这个坑!当字段里包含**HTML实体化的双引号(")**或者原始双引号时,直接用JSON_OBJECT经常会出现转义错误,导致生成的JSON格式无效——要么变成\"这种不符合规范的写法,要么出现双重转义。下面针对主流数据库给出具体的解决思路和代码:
1. 先理清问题根源
如果生成的JSON里出现\",本质是两层转义叠加了:
- 你的字段里存的是HTML实体
"(对应实际的双引号") JSON_OBJECT自动转义了字符串里的&字符,把&变成\&,最终就成了\"
如果你的字段里是原始双引号却出现这个问题,那大概率是数据入库时被提前做了HTML转义,得先还原再处理。
2. 分数据库解决方案
MySQL/MariaDB 场景
情况A:字段存的是",要转成JSON规范的\"
先用REPLACE把HTML实体替换成实际双引号,再交给JSON函数处理:
SELECT JSON_ARRAYAGG( JSON_OBJECT( 'field1', field1, 'target_field', REPLACE(target_field, '"', '"') ) ) FROM db.table;
如果字段里还有其他HTML实体(比如<、>),可以用MySQL 8.0+支持的UNESCAPE函数批量还原:
SELECT JSON_ARRAYAGG( JSON_OBJECT( 'field1', field1, 'target_field', UNESCAPE(target_field) ) ) FROM db.table;
情况B:字段存原始双引号却出现双重转义
检查是否开启了NO_BACKSLASH_ESCAPES模式——这个模式会让MySQL用双引号转义双引号,而不是反斜杠。可以临时关闭或者调整写法:
-- 临时关闭特殊模式 SET sql_mode = 'NO_BACKSLASH_ESCAPES'; SELECT JSON_OBJECT('test', 'He said ""hello""') FROM dual;
PostgreSQL 场景
PostgreSQL的JSON函数转义逻辑更严谨,但遇到HTML实体仍需先还原:
SELECT json_agg( json_build_object( 'field1', field1, 'target_field', replace(target_field, '"', '"') ) ) FROM db.table;
如果需要批量处理所有HTML实体,可以安装pg_htmltools扩展后用html_unescape函数:
CREATE EXTENSION IF NOT EXISTS pg_htmltools; SELECT json_agg( json_build_object( 'field1', field1, 'target_field', html_unescape(target_field) ) ) FROM db.table;
Oracle 场景
用UTL_I18N.UNESCAPE_REFERENCE函数直接还原所有HTML实体,再生成JSON:
SELECT JSON_ARRAYAGG( JSON_OBJECT( 'field1' VALUE field1, 'target_field' VALUE UTL_I18N.UNESCAPE_REFERENCE(target_field) ) ) FROM db.table;
3. 验证方法
生成JSON后,一定要验证格式是否正确——最简单的方式是把结果复制到浏览器控制台,用JSON.parse()测试:
JSON.parse('[{"target_field":"He said \"hello\""}]')
如果能正常解析出对象,说明转义是符合JSON规范的。
内容的提问来源于stack exchange,提问作者meaning-matters
相关产品推荐
相关产品推荐

