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

时间:2015-05-29 04:33:25

标签: c# json postgresql json.net

Follwoing 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

1 个答案:

答案 0 :(得分:3)

在某种意义上它是正确的JSON是有效的,但它显然不是你想要的。所以答案取决于“正确”的定义。我们假设你想要的是“正确的”。

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

u.team

结果:

  

[{ “名称”: “TeamA”, “玩家”:[{ “名称”: “CCC”},{ “名称”: “BBB”}]},
  { “名称”: “TeamB”, “玩家”:[{ “名称”: “AAA”},{ “名称”: “DDD”}]}]