[英]Append Multiple Objects into Existing Array Using JSON_MODIFY
问题在于将新的 JSON 数组附加到现有的 JSON 数组:
假设我有以下 JSON 数组[{"id": 1, "data": "One"}, {"id": 2, "data": "Two"}]
我如何 append [{"id": 3, "data": "Three"}, {"id": 4, "data": "Four"}]
使用JSON_MODIFY
?
更新列的结果值: [{"id": 1, "data": "One"}, {"id": 2, "data": "Two"}, {"id": 3, "data": "Three"}, {"id": 4, "data": "Four"}]
我不认为您可以通过一个JSON_MODIFY()
调用合并两个 JSON 数组,但以下语句(使用JSON_MODIFY()
)是一种可能的解决方案:
陈述:
DECLARE @json NVARCHAR(500)='[{"id": 1, "data": "One"}, {"id": 2, "data": "Two"}]'
DECLARE @new NVARCHAR(500)='[{"id": 3, "data": "Three"}, {"id": 4, "data": "Four"}]'
SELECT @json = JSON_MODIFY(
@json,
'append $',
JSON_QUERY([value])
)
FROM OPENJSON(@new)
SELECT @json
结果:
[{"id": 1, "data": "One"}, {"id": 2, "data": "Two"},{"id": 3, "data": "Three"},{"id": 4, "data": "Four"}]
您可以使用“JSON_MODIFY”函数并附加键来修改JSON对象,如下所示:
它用于单个 JSON 数组:
DECLARE @json1 NVARCHAR(500)='[{"id": 1, "data": "One"}, {"id": 2, "data": "Two"}]';
DECLARE @json2 NVARCHAR(500)='[{"id": 3, "data": "Three"}, {"id": 4, "data": "Four"}]';
SELECT t.id, t.[data]
FROM
(
SELECT * FROM OPENJSON(@json1) WITH(id int,[data] NVARCHAR(MAX))
UNION ALL
SELECT * FROM OPENJSON(@json2) WITH(id int,[data] NVARCHAR(MAX))
) t
FOR JSON PATH;
它用于单个 JSON 哈希:
DECLARE @info NVARCHAR(500)='[{"id": 1, "data": "One"}, {"id": 2, "data": "Two"}]';
PRINT @info;
SET @info = JSON_MODIFY(@info, 'append $', JSON_QUERY('{"id": 3, "data": "Three"}'))
SET @info = JSON_MODIFY(@info, 'append $', JSON_QUERY('{"id": 4, "data": "Four"}'))
PRINT @info;
我有两个结构相同的表 t1 和 t2。 表 t1 保存供应商证书的记录。 表 t2 获得供应商获得的 API 个新证书。 因此,表 t1 应使用表 t2 中的新证书进行更新。 证书数据放置在 JSON 对象数组中,类似于主题启动器的示例。
t1 col JSON_t1 中的 JSON 数组应附加 t2 col JSON_t2 中的 JSON 数组。 以下是为示例目的而简化的结构:
记录编号 | JSON_t1 |
---|---|
1个 | [{“id”:1,“数据”:“一”},{“id”:2,“数据”:“二”}] |
记录编号 | JSON_t2 |
---|---|
1个 | [{“id”:3,“数据”:“三”},{“id”:4,“数据”:“四”}] |
附加 t1.JSON_t1 |
---|
[{“id”:1,“数据”:“一”},{“id”:2,“数据”:“二”},{“id”:3,“数据”:“三”},{ “id”:4,“数据”:“四”}] |
SELECT
t1.JSON_t1,
t2.JSON_t2,
concat('[', replace(replace(json_modify(t1.JSON_t1, 'append $', json_query(t2.JSON_t2)), '[', ''), ']', ''), ']') as "appended t1.JSON_t1"
FROM t1
INNER JOIN t2 ON t1.recordId = t2.recordId
JSON_t2用json_query(t2.JSON_t2)
转成JSON格式,避免escaping个字符
JSON_t1 附加 JSON_t2 和json_modify(t1.JSON_t1, 'append $', json_query(t2.JSON_t2))
导致以下 output: [{"id": 1, "data": "One"}, {"id ": 2, "data": "Two"}, [ {"id": 3, "data": "Three"}, {"id": 4, "data": "Four"} ] ] 。 请注意粗体方括号,因为这不是正确的最终对象数组,所以应予以修复。
最后的 JSON 从所有方括号中删除, replace
方法使用了两次:for "[" and "]" replace(replace(json_modify(t1.JSON_t1, 'append $', json_query(t2.JSON_t2)), '[', ''), ']', '')
最终 JSON 在开始和结束处添加了两个方括号,以生成有效的 JSON 数组concat('[', replace(replace(json_modify(t1.JSON_t1, 'append $', json_query(t2.JSON_t2)), '[', ''), ']', ''), ']')
您可以使用ISJSON()测试最终的 JSON 是否有效
json_query
,你会得到以下结果: [{"id": 1, "data": "One"}, {"id": 2, "data": "Two"},"[{\"id\": 3, \"data\": \"Three\"}, {\"id\": 4, \"data\": \"Four\"}]"]
。 在此处查看更多信息。json_modify
json_modify(t1.JSON_t1, 'append $', json_query('{"id": 3, "data": "Three"}, {"id": 4, "data": "Four"}')
但这导致仅附加 JSON_t2 中的第一项,如下所示: [{"id": 1, "data": "One"}, {"id": 2, “数据”:“二”},{“id”:3,“数据”:“三”}]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.