繁体   English   中英

Append 使用 JSON_MODIFY 将多个对象放入现有数组

[英]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对象,如下所示:

SQL-FIDDLE

它用于单个 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 数组。 以下是为示例目的而简化的结构:

表“t1”

记录编号 JSON_t1
1个 [{“id”:1,“数据”:“一”},{“id”:2,“数据”:“二”}]

表“t2”

记录编号 JSON_t2
1个 [{“id”:3,“数据”:“三”},{“id”:4,“数据”:“四”}]

结果

附加 t1.JSON_t1
[{“id”:1,“数据”:“一”},{“id”:2,“数据”:“二”},{“id”:3,“数据”:“三”},{ “id”:4,“数据”:“四”}]

SQL方法

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

方法解释

  1. JSON_t2用json_query(t2.JSON_t2)转成JSON格式,避免escaping个字符

  2. 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"} ] ] 请注意粗体方括号,因为这不是正确的最终对象数组,所以应予以修复。

  3. 最后的 JSON 从所有方括号中删除, replace方法使用了两次:for "[" and "]" replace(replace(json_modify(t1.JSON_t1, 'append $', json_query(t2.JSON_t2)), '[', ''), ']', '')

  4. 最终 JSON 在开始和结束处添加了两个方括号,以生成有效的 JSON 数组concat('[', replace(replace(json_modify(t1.JSON_t1, 'append $', json_query(t2.JSON_t2)), '[', ''), ']', ''), ']')

  5. 您可以使用ISJSON()测试最终的 JSON 是否有效

注意事项

  • 如果你不使用json_query ,你会得到以下结果: [{"id": 1, "data": "One"}, {"id": 2, "data": "Two"},"[{\"id\": 3, \"data\": \"Three\"}, {\"id\": 4, \"data\": \"Four\"}]"] 此处查看更多信息。
  • 我试图仅从方括号中删除 JSON_t2 并像这样使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM