使用JSON_MODIFY追加变量时出现转义字符问题求助
解决JSON_MODIFY追加变量时的转义问题
嘿,我之前也踩过这个坑!这是因为SQL Server默认会把字符串变量当成普通文本处理,自动转义双引号,导致你得到的是带转义的字符串数组,而非预期的对象数组。下面给你讲清楚怎么搞定它:
问题根源
当你直接把字符串形式的JSON变量传给JSON_MODIFY时,SQL Server会把它当作普通字符串插入,而不是解析成JSON对象。为了保证字符串的合法性,它会自动转义双引号,最后就出现了你看到的["{\"name\":\"PosTitle\",...}"]这种结果。
解决方案:用JSON_QUERY()包裹变量
核心技巧就是用JSON_QUERY()告诉SQL Server:“这不是普通字符串,是合法的JSON片段!”,这样它就不会转义引号,而是直接把对象插入目标数组。
完整代码示例
-- 初始化原始JSON对象 DECLARE @originalJson NVARCHAR(MAX) = '{"data": []}'; -- 要追加的fieldError对象(确保是合法的JSON字符串) DECLARE @fieldErrorObj NVARCHAR(MAX) = '{"name":"PosTitle","status":"the field is messed up, yo"}'; -- 正确写法:用JSON_QUERY包裹变量,指定append模式 SET @originalJson = JSON_MODIFY( @originalJson, 'append $.fieldErrors', -- append表示往数组末尾加元素,若fieldErrors不存在则自动创建数组 JSON_QUERY(@fieldErrorObj) -- 关键:避免转义的核心操作 ); -- 查看最终结果 SELECT @originalJson AS FinalResult;
执行结果
你会得到完全符合预期的JSON:
{"data":[],"fieldErrors":[{"name":"PosTitle","status":"the field is messed up, yo"}]}
错误写法对比(为什么会出问题)
如果跳过JSON_QUERY()直接传变量,就会触发自动转义:
SET @originalJson = JSON_MODIFY( @originalJson, 'append $.fieldErrors', @fieldErrorObj );
结果就是你遇到的带转义的字符串数组:
{"data":[],"fieldErrors":["{\"name\":\"PosTitle\",\"status\":\"the field is messed up, yo\"}"]}
额外提示
如果你的@fieldErrorObj是动态拼接出来的(比如从其他表或变量组装),只要确保最终是合法的JSON字符串,再用JSON_QUERY()包裹就没问题。要是不确定拼接内容是否合法,可以先用ISJSON()做个验证。
内容的提问来源于stack exchange,提问作者NamedArray
相关产品推荐
相关产品推荐

