C# Postgres json_agg包含列标题-json不正确?

C# Postgres json_agg包含列标题-json不正确?,c#,json,postgresql,json.net,C#,Json,Postgresql,Json.net,接下来,我有一个SQL查询,返回下表: team (json) "{"Name":"TeamA","Players":[{"Name":"CCC"},{"Name":"BBB"}]}" "{"Name":"TeamB","Players":[{"Name":"AAA"},{"Name":"DDD"}]}" 我需要将其聚合为JSON,以便在我的应用程序中使用。我正在使用以下命令: SELECT json_agg(u) FROM (SELECT DISTINCT ON (t.team->&g

接下来,我有一个SQL查询,返回下表:

team (json)
"{"Name":"TeamA","Players":[{"Name":"CCC"},{"Name":"BBB"}]}"
"{"Name":"TeamB","Players":[{"Name":"AAA"},{"Name":"DDD"}]}"
我需要将其聚合为JSON,以便在我的应用程序中使用。我正在使用以下命令:

SELECT json_agg(u) FROM (SELECT DISTINCT ON (t.team->>'Name') t.team
FROM   matches m, json_array_elements(m.match->'Teams') t(team)
ORDER  BY t.team->>'Name', m.id DESC) AS u
返回:

"[{"team":{"Name":"TeamA","Players":[{"Name":"CCC"},{"Name":"BBB"}]}}, 
 {"team":{"Name":"TeamB","Players":[{"Name":"AAA"},{"Name":"DDD"}]}}]"
因此,它似乎在每个对象之前都放置了一个“team”标记。这无法在我的C#应用程序中正确序列化。在阅读之后,我相信这可能是不正确的。这是正确的吗

我想以以下形式得到它:

 "[{"Name":"TeamA","Players":[{"Name":"CCC"},{"Name":"BBB"}]}, 
  {"Name":"TeamB","Players":[{"Name":"AAA"},{"Name":"DDD"}]}]"
我相信这是正确的JSON,它将在我的应用程序中正确解析

我在C#中使用的类如下所示:

//[JsonObject(Title="team")]  I tried adding this too
public class Team
{
    public string Name { get; set; }
    public List<Player> Players { get; set; }
}
和样本数据:

5;{"Id":1,"Teams":[{"Name":"TeamA","Players":[{"Name":"AAA"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"CCC"},{"Name":"DDD"}]}],"TeamRank":[1,2]}
6;{"Id":2,"Teams":[{"Name":"TeamA","Players":[{"Name":"CCC"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"AAA"},{"Name":"DDD"}]}],"TeamRank":[1,2]}

请参阅了解更多信息。

从某种意义上说,它是正确的JSON,它是有效的,但它显然不是您想要的。因此,答案取决于“正确”的定义。我们将假定您想要的是“正确的”

您要求它聚合
u
,这是一个列为
team
的结果集。这意味着它必须将此信息添加到结果中。您应该只要求聚合
u.team
,这是您想要的字段。然后你会得到你想要的结果

WITH matches as
(
select 5 as id, '{"Id":1,"Teams":[{"Name":"TeamA","Players":[{"Name":"AAA"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"CCC"},{"Name":"DDD"}]}],"TeamRank":[1,2]}'::json as match
union all
select 6 as id, '{"Id":2,"Teams":[{"Name":"TeamA","Players":[{"Name":"CCC"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"AAA"},{"Name":"DDD"}]}],"TeamRank":[1,2]}' as match
)
SELECT json_agg(u.team) FROM (
SELECT DISTINCT ON (t.team->>'Name') t.team
FROM   matches m, json_array_elements(m.match->'Teams') t(team)
ORDER  BY t.team->>'Name', m.id DESC) AS u;
结果:

[{“姓名”:“车队”、“球员”:[{“姓名”:“CCC”},{“姓名”:“BBB”},
{“Name”:“TeamB”,“Players”:[{“Name”:“AAA”},{“Name”:“DDD”}]}]


使用此链接并检查json是否有效。我检查了你的json,它似乎无效!!两者似乎都是有效的。不过,有额外的团队标记似乎是多余的?它对我来说似乎有效,它只是有一个不必要的1元素数组,其中包含一个1键对象。由于您没有提供示例数据和表定义,因此我无法真正帮助您;也许你应该修正这个问题,完成后在这里发表评论。@CraigRinger更新了表定义和样本数据。哇,真是太容易了。谢谢。
WITH matches as
(
select 5 as id, '{"Id":1,"Teams":[{"Name":"TeamA","Players":[{"Name":"AAA"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"CCC"},{"Name":"DDD"}]}],"TeamRank":[1,2]}'::json as match
union all
select 6 as id, '{"Id":2,"Teams":[{"Name":"TeamA","Players":[{"Name":"CCC"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"AAA"},{"Name":"DDD"}]}],"TeamRank":[1,2]}' as match
)
SELECT json_agg(u.team) FROM (
SELECT DISTINCT ON (t.team->>'Name') t.team
FROM   matches m, json_array_elements(m.match->'Teams') t(team)
ORDER  BY t.team->>'Name', m.id DESC) AS u;