【问题标题】:Escaping JSON special characters with JSON_QUERY not working使用 JSON_QUERY 转义 JSON 特殊字符不起作用
【发布时间】:2021-03-03 09:45:51
【问题描述】:

我正在进行的一个项目涉及在表格列中存储一串数据。该表将具有与记录相关的其他列。我们决定使用 JSON 存储字符串数据列。

从表中,视图会将 JSON 列解析为单独的列。该视图还将具有从其他主表列派生的列。然后,视图中的数据用于通过 SSRS 填充文档的某些部分。

将数据加载到主表时,我需要使用单独的表来导出其他列值和 JSON 列。我决定为此使用公用表表达式。在查询结束时,我将来自不同公用表表达式的派生列(包括 JSON 列)汇集在一起​​,并将它们插入到主表中。

我几乎完成了,直到我意识到当我使用 FOR JSON 创建 JSON 列时,它会转义特殊字符。我做了一些研究,并一直在尝试使用 JSON_QUERY 函数来解决这个问题,但它不起作用。这是问题的简化:

WITH Table1
(
    First_Name_JSON
)
As
(
    SELECT 'Tim/' As First_Name
    FOR JSON PATH
)
SELECT JSON_QUERY(Table1.First_Name_JSON) as first_name
FROM Table1
FOR JSON PATH

这是输出:

[{"first_name":[{"First_Name":"Tim\/"}]}]

为什么它还在逃跑? documentation 表明传递由 FOR JSON 创建的列应该使 JSON_QUERY 函数返回它而不使用转义字符。

我知道这行得通:

SELECT JSON_QUERY('{"Firt_Name": "Tim/"}') as first_name
FOR JSON PATH

输出:

[{"first_name":{"Firt_Name": "Tim/"}}]

但是,我需要能够传递一个已经包含 JSON 数据的列,因为它的逻辑很长,包含许多列。与在每列周围硬编码 JSON 格式相比,使用 FOR JSON 是进行更改的理想选择。

我一定错过了什么。感谢您的帮助。

【问题讨论】:

    标签: sql json sql-server


    【解决方案1】:

    很简单:

    {"Firt_Name": "Tim/"} 是有效的 JSON,因此JSON_QUERY 可以按原样返回。 Tim/ 无效,需要先转义。

    Quote from the docs:

    JSON_QUERYFOR JSON 一起使用

    JSON_QUERY 返回一个有效的 JSON 片段。因此,FOR JSON 不会转义 JSON_QUERY 返回值中的特殊字符。

    如果您使用FOR JSON 返回结果,并且您包含已经采用 JSON 格式的数据(在列中或作为表达式的结果),请将 JSON 数据包装为JSON_QUERY 不带路径参数。


    考虑到您的用例,是否不可能将 JSON 传递到您需要的地方并在那里取消转义? OPENJSONJSON_VALUE 能够做到这一点。

    【讨论】:

    • 现在我明白了。我误解了“已经采用 JSON 格式”部分的意思是,如果您通过 FOR JSON 将已经采用 JSON 格式的内容传递给 JSON_QUERY,而不是通过 FOR JSON 传递时文本需要采用 JSON 格式。对,这就是我接下来要考虑的,所以我将探索它,并在将列传递给 FOR JSON 之前将它们格式化为 JSON 格式。我会赞成你的回答,但我没有足够的声誉。不过谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多