我有一个表,其中包含带有组 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"}}]