c# - Postgres json_agg 包含列标题 - JSON 不正确?

标签 c# json postgresql json.net

关注this post ,我有一个返回下表的 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"}]}}]"

看来它在每个对象之前放置了一个“团队”标签。这在我的 C# 应用程序中无法正确序列化。看完this question我相信这可能不是正确的 JSON。这是正确的吗?

我想以以下形式获取它:

 "[{"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; }
}

这是正确的 JSON,我需要修复我的 C# 类吗?或者它是否不正确,如何从 json_agg 输出中删除列标题?

更新:

这是我的表结构:

CREATE TABLE matches
(
  id serial NOT NULL,
  match json,
  CONSTRAINT matches_pkey PRIMARY KEY (id)
)

示例数据:

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]}

请参阅this question了解更多。

最佳答案

从某种意义上说,它是正确的 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;

结果:

[{"Name":"TeamA","Players":[{"Name":"CCC"},{"Name":"BBB"}]},
{"Name":"TeamB","Players":[{"Name":"AAA"},{"Name":"DDD"}]}]

关于c# - Postgres json_agg 包含列标题 - JSON 不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30521196/

相关文章:

c# - "Access is Denied"LOGON32_LOGON_SERVICE

c# - 为什么我需要在套接字上定义端点两次才能开始接收数据?

javascript - 用于 URL 的 Bootstrap 表格式化程序

sql - 如何进行 PostgreSQL 条件内连接更新

sql - 如何从sql查询中获取二进制数据?

c# - 读写文本文件 Windows Phone 8.1

C# 从接口(interface)转换类型

php - 使用 Zend Json Server,ajax 调用在 css 弹出窗口中列出某些信息

json - 需要从包含特定字符 '/' 的 JSON 中获取所有键值对

ruby-on-rails - 致命 : role "root" does not exist