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

问题描述 投票:0回答:1

当未指定其他根目录或名称未知时,我想附加到JSON字符串的根目录。不幸的是,在我可以附加另一个JSON节点之前,已经指定了一些其他根节点must。当未指定其他根目录或其根名称未知时,如何附加其他JSON结构?

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

declare @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"}]

HOWEVER如果我在原始的select语句中指定了根路径(这是不希望的),THEN稍后我将能够附加其他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"}],"Added Stuff":["some more stuff"]}

==期望结果==

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

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

,否则您无法修改JSON字符串。

因此,所需的结果可能看起来像这样:

{
"SomeRoot": [
    {
        "colA": "stuff",
        "colB": "stuff",
        "colC": "stuff"
    }
],
"ExampleAppend1": [
    "content"
],
"ExampleAppend2": [
    {
        "speedracer": "go"
    }
]
}
json sql-server tsql
1个回答
0
投票

说明:

我不确定这是否是您问题的确切答案,但是评论太久了。值得一提的是,根据FOR JSON PATHROOT选项,WITHOUT_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"]}
    
© www.soinside.com 2019 - 2024. All rights reserved.