如何使用JSON_VALUE解析含未转义内部双引号的JSON字符串?
解决JSON_VALUE查询无效JSON返回NULL的问题
你的示例JSON属于格式无效的JSON——Message字段值里的双引号没有按JSON规范转义,正常JSON要求字符串内部的双引号必须用反斜杠转义(写成\"),无效的JSON结构会让JSON_VALUE无法解析,直接返回NULL。
下面是不同数据库下的处理方案:
SQL Server 处理方式
如果没法提前修正JSON的写入格式,可以先通过字符串替换转义未处理的双引号,再执行查询:
SELECT JSON_VALUE( REPLACE(params, '"', '\"'), '$.Message' ) AS Message FROM your_table
注意:这种简单替换可能会误转义JSON结构本身的引号(比如键名的引号),如果你的JSON只有字段值里存在未转义的引号,这个方法可以临时解决问题。
更稳妥的方式是用OPENJSON,它对轻微格式错误的兼容性更好:
SELECT j.Message FROM your_table CROSS APPLY OPENJSON(params) WITH ( Sender NVARCHAR(100), Event NVARCHAR(100), EventDate DATE, Message NVARCHAR(MAX) ) j
MySQL 处理方式
MySQL中可以结合REPLACE和JSON函数来处理:
SELECT JSON_UNQUOTE( JSON_EXTRACT( REPLACE(params, '"', '\\"'), '$.Message' ) ) AS Message FROM your_table; -- 用简化运算符的写法 SELECT REPLACE(params, '"', '\\"')->>'$.Message' AS Message FROM your_table;
最佳建议
最省心的方式是在数据写入数据库前就保证JSON格式合法,用标准的JSON序列化工具(比如Python的json模块、Java的Jackson框架)生成JSON,它们会自动处理字符串内的特殊字符转义,从根源避免这类问题。
内容的提问来源于stack exchange,提问作者john
相关产品推荐
相关产品推荐

