我有一个表,其中包含带有组 ID 的 json 字符串。我想创建一个包含所有具有相同 id 的 json 对象的 json 数组。

请注意,在我的情况下,我试图放入数组的列内容本身就是 json 片段,因此我的情况和问题比将行转换为数组更具体。 OPENJSON的使用在接受的答案中也利用了这个细节。

但是,我找不到使用 FOR JSON 的方法,该方法允许我选择单个列,而该列的名称不会成为数组中所有对象的键。

我意识到我试图摆脱的键是将列投影到 json 的键值表示的键所必需的,但在这种情况下,我只选择了一列,我很好奇是否有我不能的技巧考虑到。

我可以通过简单地使用 COALASCE 来实现我想要的,但我想知道是否可以使用 FOR JSON 处理这种边缘情况。这是演示我正在尝试执行的操作的简化代码:

BEGIN 
    declare @Json_Snippets table (id int, json nvarchar(max)); 
 
    insert into @Json_Snippets (id, json) VALUES (1, '{"root":{"obj":"one"}}'); 
    insert into @Json_Snippets (id, json) VALUES (1, '{"root":{"obj":"two"}}'); 
 
   select 
          JSON_QUERY(js.json) as 'dont_want_this' 
   from 
        @Json_Snippets js 
    FOR JSON PATH; 
 
END 

我必须使用 JSON_QUERY 以避免在 json 列中转义字符,即 json 字符串保持为 json。运行上面给出:
[{"dont_want_this":{"root":{"obj":"one"}}},{"dont_want_this":{"root":{"obj":"two"}}}] 

我想得到的是:
[{"root":{"obj":"one"}},{"root":{"obj":"two"}}] 

请您参考如下方法:

如果我理解正确,下一种方法可能会有所帮助。只需选择您的 json数据与 OPENJSON()WITH子句,然后用 FOR JSON 格式化结果:

-- Table 
declare @Json_Snippets table (id int, json nvarchar(max)); 
insert into @Json_Snippets (id, json) VALUES (1, '{"root":{"obj":"one"}}'); 
insert into @Json_Snippets (id, json) VALUES (1, '{"root":{"obj":"two"}}'); 
 
-- Statement 
SELECT j.[root] 
FROM @Json_Snippets t 
CROSS APPLY OPENJSON(t.json, '$') WITH ([root] nvarchar(max) AS JSON) j 
FOR JSON AUTO 

输出:
[{"root":{"obj":"one"}},{"root":{"obj":"two"}}] 


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!