当未指定其他根目录或名称未知时,我想附加到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字符串,除非它已经具有根,并且其中一个根是已知的。另一个问题是,除非已将其预先设置为{}
因此,所需的结果可能看起来像这样:
{
"SomeRoot": [
{
"colA": "stuff",
"colB": "stuff",
"colC": "stuff"
}
],
"ExampleAppend1": [
"content"
],
"ExampleAppend2": [
{
"speedracer": "go"
}
]
}
说明:
我不确定这是否是您问题的确切答案,但是评论太久了。值得一提的是,根据FOR JSON PATH
和ROOT
选项,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 PATH
,WITHOUT_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, 'append $."Added Stuff"', 'some more stuff' )
结果:
{"colA":"stuff","colB":"stuff","colC":"stuff","Added Stuff":["some more stuff"]}
将内容附加到使用
:FOR JSON PATH
,WITHOUT_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 PATH
和ROOT
生成的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"]}