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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:13:37