json - 使用 JSON_MODIFY(),当名称未知或未指定时,如何将字符串附加到根路径?

标签 json sql-server t-sql

当没有指定其他根或其名称未知时,我想附加到 JSON 字符串的根。不幸的是,在附加另一个 JSON 节点之前,必须先指定一些其他根节点。当未指定其他根或其根名称未知时,如何附加其他 JSON 结构?

首先,我从一个空的 JSON 对象/字符串开始。 JSON_MODIFY() 无法处理空字符串 '':

声明 @jsonResponse nvarchar(max) = '{}';

然后,我填充响应:

select @jsonResponse = (
        select
            'stuff' as colA
            ,'stuff' as colB
            ,'stuff' as colC
        for json path, INCLUDE_NULL_VALUES 
);

如果我尝试像这样附加到 @jsonResponse:

set @jsonResponse =  json_modify(@jsonResponse, 'append $."Added Stuff"', 'some more stuff'); --no error, but no append
--set @jsonResponse =  json_modify(@jsonResponse, 'append $.[0]', 'some more stuff'); --error
--set @jsonResponse =  json_modify(@jsonResponse, 'append $[0]', 'some more stuff'); --no error, but no append
--set @jsonResponse =  json_modify(@jsonResponse, 'append [0].$', 'some more stuff'); --error
--set @jsonResponse =  json_modify(@jsonResponse, 'append [0]$', 'some more stuff'); --error

这些都不起作用。唯一不会产生错误的是第一个和第三个示例'append $."Added Stuff"'。这就是我得到的全部:

[{"colA":"stuff","colB":"stuff","colC":"stuff"}]

但是如果我在原始 select 语句中指定根路径(这是不需要的),那么我稍后将能够附加其他 JSON 结构:

select @jsonResponse = (

        select
            'stuff' as colA
            ,'stuff' as colB
            ,'stuff' as colC
        for json path, root('root'), INCLUDE_NULL_VALUES 

)

set @jsonResponse =  json_modify(@jsonResponse, 'append $."Added Stuff"', 'some more stuff')

结果:

{"root":[{"colA":"stuff","colB":"stuff","colC":"stuff"}],"添加的东西":["更多的东西"]}

==期望的结果==

我想随意将内容附加到我的 JSON 字符串,即使该字符串没有根[{"key":"val"}],或者其根未知 {"RootNameUnknown": []},或者它是一个空对象 {}

我无法(或不知道如何)附加到预先建立的 JSON 字符串,除非它已经有根,并且其中一个根已知。另一个问题是,您无法修改 JSON 字符串,除非您预先将其设置为 {}

因此,期望的结果可能如下所示:

{
"SomeRoot": [
    {
        "colA": "stuff",
        "colB": "stuff",
        "colC": "stuff"
    }
],
"ExampleAppend1": [
    "content"
],
"ExampleAppend2": [
    {
        "speedracer": "go"
    }
]
}

最佳答案

说明:

我不确定这是否是您问题的准确答案,但评论太长了。值得一提的是,FOR JSON PATH 根据 ROOTWITHOUT_ARRAY_WRAPPER 选项返回不同的 JSON 内容。下表显示了不同的 JSON 输出:

-----------------------------------------------------------------------------------------------------       
|Statement                              | Result                                                    |
-----------------------------------------------------------------------------------------------------       
| SELECT                                | [{"colA":"stuff","colB":"stuff","colC":"stuff"}]          |
|   'stuff' AS colA,                    | JSON array                                                | 
|   'stuff' AS colB,                    |                                                           |
|   'stuff' AS colC                     |                                                           |
| FOR JSON PATH                         |                                                           |
-----------------------------------------------------------------------------------------------------       
| SELECT                                | {"colA":"stuff","colB":"stuff","colC":"stuff"}            |
|   'stuff' AS colA,                    | JSON object                                               | 
|   'stuff' AS colB,                    |                                                           |
|   'stuff' AS colC                     |                                                           |
| FOR JSON PATH, WITHOUT_ARRAY_WRAPPER  |                                                           |
-----------------------------------------------------------------------------------------------------       
| SELECT                                | {"root":[{"colA":"stuff","colB":"stuff","colC":"stuff"}]} |
|   'stuff' AS colA,                    | JSON object                                               | 
|   'stuff' AS colB,                    |                                                           |
|   'stuff' AS colC                     |                                                           |
| FOR JSON PATH, ROOT('root')           |                                                           |
-----------------------------------------------------------------------------------------------------       

因此,如果您想使用 JSON_MODIFY() 将内容附加到 JSON 字符串,则需要使用 path 表达式和 append 修饰符。

将内容附加到使用 FOR JSON PATH 生成的 JSON 文本:

DECLARE @jsonResponse nvarchar(max)
SELECT @jsonResponse = (
   SELECT 'stuff' AS colA, 'stuff' AS colB, 'stuff' AS colC
   FOR JSON PATH
)
SELECT @jsonResponse = JSON_MODIFY(
   @jsonResponse,
   'append $',
   'some more stuff'
)

结果:

[{"colA":"stuff","colB":"stuff","colC":"stuff"},"some more stuff"]

将内容附加到使用 FOR JSON PATHWITHOUT_ARRAY_WRAPPERappend 修饰符生成的 JSON 文本:

DECLARE @jsonResponse nvarchar(max)
SELECT @jsonResponse = (
   SELECT 'stuff' AS colA, 'stuff' AS colB, 'stuff' AS colC
   FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
)
SELECT @jsonResponse = JSON_MODIFY(
   @jsonResponse,
   'append $."Added Stuff"',
   'some more stuff'
)

结果:

{"colA":"stuff","colB":"stuff","colC":"stuff","Added Stuff":["some more stuff"]}

将内容附加到使用 FOR JSON PATHWITHOUT_ARRAY_WRAPPER 且不使用 append 修饰符生成的 JSON 文本:

DECLARE @jsonResponse nvarchar(max)
SELECT @jsonResponse = (
   SELECT 'stuff' AS colA, 'stuff' AS colB, 'stuff' AS colC
   FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
)
SELECT @jsonResponse = JSON_MODIFY(
   @jsonResponse,
   '$."Added Stuff"',
   'some more stuff'
)

结果:

{"colA":"stuff","colB":"stuff","colC":"stuff","Added Stuff":"some more stuff"}

将内容附加到使用 FOR JSON PATHROOT 生成的 JSON 文本:

DECLARE @jsonResponse nvarchar(max)
SELECT @jsonResponse = (
   SELECT 'stuff' AS colA, 'stuff' AS colB, 'stuff' AS colC
   FOR JSON PATH, ROOT('root')
)
SELECT @jsonResponse = JSON_MODIFY(
   @jsonResponse,
   'append $."Added Stuff"',
   'some more stuff'
)

结果:

{"root":[{"colA":"stuff","colB":"stuff","colC":"stuff"}],"Added Stuff":["some more stuff"]}

关于json - 使用 JSON_MODIFY(),当名称未知或未指定时,如何将字符串附加到根路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62412440/

相关文章:

sql-server - SQL Server 存储过程 XML 无法正确获取节点

sql - SQL 透视多列

java - 现场级反序列化不适用于 jackson

c# - 如何在C#中将Json对象转换为数组

json - 无法从 AFNetworking 的 responseObject 解析 JSON

mysql - 三表查询,无公共(public)列

c# - 将 MSSQL GetUTCDate() 转换为 PHP/Unix/MySQL Ticks

json - Avro 不处理循环引用

sql-server - Azure PaaS 逻辑服务器创建时间

SQL查询where基于列值