STRING_ESCAPE json正斜杠

时间:2019-01-09 16:04:54

标签: json sql-server tsql sql-server-2017

使用发现的STRING_ESCAPE函数here我用字符串值转义了某些列,以便它们适合JSON格式。但是,在我看来,将其应用于URL时,其行为会很奇怪。

SELECT STRING_ESCAPE('https://www.website.com/page', 'json')

返回https:\/\/www.website.com\/page

我可以理解,实际上,根据this post,正斜杠是允许的,而JSON则不需要,因此在使用此功能时会将其包括在内。但是,如果您使用此值(https:\/\/www.website.com\/page创建HTML标记,则该链接将不再起作用,至少在我的浏览器中,该链接正试图浏览到https://www.website.com//page

由于我不知道我的原始字符串是否包含\/,所以我不能仅仅使用REPLACE(STRING_ESCAPE([column], 'json'), '\/', '/')来解决这个问题。

是否有一个选项可以禁止转义正斜杠?或其他解决此问题的聪明方法?

2 个答案:

答案 0 :(得分:0)

我不知道有任何选项可以禁用转义正斜杠,但是如果您正在寻找解决方法的想法,则可以用一些虚拟值替换正斜杠,然后进行转义,然后通过以下方式恢复正斜杠:用正斜杠替换虚拟值。

这样的想法:

DECLARE @replace_value VARCHAR(36) = NEWID();
SELECT 
    STRING_ESCAPE('https://www.website.com/page', 'json'),
    REPLACE(STRING_ESCAPE(REPLACE('https://www.website.com/page', '/', @replace_value), 'json'), @replace_value, '/');

不是最漂亮的,但是可以完成工作。

答案 1 :(得分:0)

序言:最初的问题是试图将 JSON 转义的值 稍后作为 JSON 使用,因为 URL 不是 JSON 字符串。但是,此答案并未关注在 HTML 中使用之前不正确的域使用和/或未能解码 JSON 值。


相反,这个答案纠正了这种误解:

<块引用>

因为我不知道我的原始字符串是否包含 [\/],所以我不能只使用替换来解决这个问题。

只要使用了 STRING_ESCAPE,使用 STRING_ESCAPE 后执行替换是一种有效的方法,如原始问题所示:

REPLACE(STRING_ESCAPE([column], 'json'), '\/', '/')

这是因为 STRING_ESCAPE 对每个 / \ 进行转义,这意味着原始源中的任何 \/ 被转义如\\\/。 (只有 \ 没有被转义,才会有问题。)

考虑这些示例,这些示例会生成没有转义立体线的有效 JSON 字符串内容,它们证明了简单 REPLACE 方法的正确性。

INPUT             STRING_ESCAPE       REPLACE(.., '\/', '/')
hello\world       hello\\world        hello\\world
hello/world       hello\/world        hello/world
hello\/workd      hello\\\/world      hello\\/world
\\/\/\\           \\\\\/\\\/\\\\      \\\\/\\/\\\\

以上值代表实际的字符串内容