当没有指定其他根或其名称未知时,我想附加到 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
根据 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"]}
关于json - 使用 JSON_MODIFY(),当名称未知或未指定时,如何将字符串附加到根路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62412440/