正确转义 JSON 字符串中的字符

you*_*gme 5 t-sql json sql-server-2016

在下面的示例中,如何转义 @data 变量中的双引号字符?

declare @data nvarchar(max) = N'"TEST"';
declare @jsonFragment nvarchar(max);
declare @id int = 999;

set @jsonFragment = ',"' + cast(@id as nvarchar(16)) + '":"' + @data + '"';

select @jsonFragment;
Run Code Online (Sandbox Code Playgroud)

结果是:

 ,"999":""TEST""
Run Code Online (Sandbox Code Playgroud)

我需要它是:

 ,"999":"\"TEST\""
Run Code Online (Sandbox Code Playgroud)

据我了解,选择for json path要求我定义一个静态键名称 - 但可以看出,我有一个场景,其中键名称是动态定义的。

在我的实际用例中,此字符串构造发生在一个stuff语句内,该语句本身是利用 CTE 的较大列定义的一部分select- 这意味着很难创建要使用sp_executeSQL.

Han*_*dyD 3

有一个用于此目的的系统函数,称为STRING_ESCAPE,它将根据给定字符串类型的需要转义字符。

在你的例子中:

declare @data nvarchar(max) = N'"TEST"';
declare @jsonFragment nvarchar(max);
declare @id int = 999;

set @jsonFragment = ',"' + cast(@id as nvarchar(16)) + '":"' + STRING_ESCAPE(@data, 'json') + '"';

select @jsonFragment;
Run Code Online (Sandbox Code Playgroud)

返回:

,"999":"\"TEST\""
Run Code Online (Sandbox Code Playgroud)

它适用于所有需要转义的元素,例如路径名中的斜杠,例如:

SELECT STRING_ESCAPE(N'C:\PathName\Temp\', 'json')
Run Code Online (Sandbox Code Playgroud)

退货

C:\\PathName\\Temp\\
Run Code Online (Sandbox Code Playgroud)