我需要从一个查询中创建JSON输出,该查询在具有一对多关系的两个表之间使用内部连接。
我希望将辅助表的值嵌套为主表的数组属性。
请看下面的例子:
DECLARE @Persons AS TABLE
(
person_id int primary key,
person_name varchar(20)
)
DECLARE @Pets AS TABLE
(
pet_owner int, -- in real tables, this would be a foreign key
pet_id int primary key,
pet_name varchar(10)
)
INSERT INTO @Persons (person_id, person_name) VALUES
(2, 'Jack'),
(3, 'Jill')
INSERT INTO @Pets (pet_owner, pet_id, pet_name) VALUES
(2, 4, 'Bug'),
(2, 5, 'Feature'),
(3, 6, 'Fiend')
并查询:
DECLARE @Result as varchar(max)
SET @Result =
(
SELECT person_id as [person.id],
person_name as [person.name],
pet_id as [person.pet.id],
pet_name as [person.pet.name]
FROM @Persons
JOIN @Pets ON person_id = pet_owner
FOR JSON PATH, ROOT('pet owners')
)
PRINT @Result
这将打印以下JSON:
{
"pet owners":
[
{"person":{"id":2,"name":"Jack","pet":{"id":4,"name":"Bug"}}},
{"person":{"id":2,"name":"Jack","pet":{"id":5,"name":"Feature"}}},
{"person":{"id":3,"name":"Jill","pet":{"id":6,"name":"Fiend"}}}
]
}
但是,我希望将pets数据作为所有者数据中的数组:
{
"pet owners":
[
{
"person":
{
"id":2,"name":"Jack","pet":
[
{"id":4,"name":"Bug"},
{"id":5,"name":"Feature"}
]
}
},
{
"person":
{
"id":3,"name":"Jill","pet":
{"id":6,"name":"Fiend"}
}
}
]
}
我该怎么做呢?
5条答案
按热度按时间qgzx9mmu1#
可以使用以下查询:
有关详细信息,请参见https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/10/09/returning-child-rows-formatted-as-json-in-sql-server-queries/
n6lpvg4x2#
对于深度嵌套的数组,子查询很快就变得难以管理:
我创建了一个连接所有表的关系(非json)视图,并在列别名中嵌入了json结构,就像表示json路径一样,但我还使用[]表示json节点是一个数组,如下所示:
我编写了一个存储过程,它在非json视图中创建一个json视图,解析关系视图的列名,使json更美观。见下文。用关系视图的名称调用它,它会创建一个视图。它没有经过彻底测试,但对我来说是有效的。唯一需要注意的是,表需要有名为id的列。它使用string_agg()和json_array()**到sql版本需要是相当新的。它也被设置为在根中返回一个数组。它需要调整以返回一个对象。
vqlkdk9b3#
我已经按照@Razvan Socol制作了下面的json格式。
qkf9rpyu4#
可以这样实现
这是结果
bxfogqkk5#
现在,你完全是在盲目地飞行,如果设计API的人是理智的,那么假设它将返回某种用户对象的数组可能是安全的--但是,仅仅通过查看这个端点是无法得出每个用户对象实际携带的数据的。