C# 按类型解析 JSON 组

标签 c# .net json c#-4.0 json.net

这是JSON

[
    {
        "name": "TeamA",
        "zone": "North",
        "id": 12,
        "players": [
            {
                "name": "TAPlayer1",
                "type": "Keeper"
            },
            {
                "name": "TAPlayer2",
                "type": "Bowler"
            }
        ]
    },
    {
        "name": "TeamB",
        "zone": "South",
        "id": 20,
        "players": [
            {
                "name": "TBPlayer1",
                "type": "Keeper"
            }
        ]
    },
    {
        "name": "TeamC",
        "zone": "South",
        "id": 45,
        "players": null
    },
    {
        "name": "TeamD",
        "zone": "North",
        "id": 40,
        "players": [
            {
                "name": "Tom",
                "type": "Keeper"
            },
            {
                "name": "Max",
                "type": "Keeper"
            },
            {
                "name": "Sam",
                "type": "Bowler"
            },
            {
                "name": "Jim",
                "type": "Keeper"
            }
        ]
    }
]

我想要这样的结果(按区域分组,球员类型守门员)

North
TAPlayer1
Tom
Max

South
TBPlayer1

我试着这样解析

public class Player
    {
        public string name { get; set; }
        public string type { get; set; }
    }

    public class Teams
    {
        public string name { get; set; }
        public string zone { get; set; }
        public int id { get; set; }
        public List<Player> players { get; set; }
    }
        Teams[] ownersArray = JsonConvert.DeserializeObject<Teams[]>(json);

我想按区域分组显示结果,类型应该是 keeper。如有任何建议,我们将不胜感激。

提前致谢。

最佳答案

反序列化JSON后

Teams[] teams = JsonConvert.DeserializeObject<Teams[]>(json);

您可以使用 LINQ 按区域分组

var groupedByZone = teams.Where(t => t.players != null).GroupBy(t => t.zone);

我们希望从每个组中获得球员

var players = groupedByZone.Select(g => new { 
    name = g.Key, 
    players = g.SelectMany(t => t.players).Where(p => p.type == "Keeper").ToArray() 
});

这一切都可以在一条语句中完成

var keepersByZone = teams.Where(t => t.players != null)
                         .GroupBy(team => team.zone)
                         .Select(g => new { 
                             name = g.Key, 
                             players = g.SelectMany(team => team.players)
                                        .Where(player => plapyer.type == "Keeper")
                                        .OrderBy(player => player.name)
                                        .ToArray() 
                         });

显示输出

foreach(var zone in keepersByZone) {
    Console.WriteLine(zone.name);
    foreach(var player in zone.players) {
        Console.WriteLine(player.name);
    }
    Console.WriteLine();
}

关于C# 按类型解析 JSON 组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45301168/

相关文章:

c# - 如何在可移植库中反序列化 JSON

android - 从电子邮件 header 解析 JSON

c# - 如何在c#字段中转换json数组字段

json - 如何以编程方式创建给定(json)模式的 OrientDB 数据库?

c# - 如何开始使用适用于 ASP.NET 的新 Facebook SDK

c# - 逐行读取word文档

.net - 在所有空格处分割字符串

CSS 列的 .NET UserControl?

c# - 我们如何使用具有不同属性名称的 JsonSerializer.DeserializeAsyncEnumerable 从巨大的 json 反序列化为 ProtoBuf

c# - 为什么我们不能只使用 [][] 而不是 int[][]?