C#将多个JSON集合反序列化为单个List <t>

时间:2017-08-16 12:36:12

标签: c# json deserialization

我从web api中获取同一对象的集合集合。 然后,我想将JSON反序列化为单个List

JSON如下:

{
  "Liverpool": [
    {
      "playerId": "LIV01",
      "name": "Adam Llana",
      "position": "Midfielder"
    },
    {
      "playerId": "LIV02",
      "name": "Daniel Sturridge",
      "position": "Forward"
    }
  ],
  "ManchesterUnited": [
    {
      "playerId": "MNU01",
      "name": "Daley Blind",
      "position": "Defender"
    },
    {
      "playerId": "MNU02",
      "name": "Romelu Lukaku",
      "position": "Forward"
    }
  ],
  "Arsenal": [
    {
      "playerId": "ARS01",
      "name": "Petr Cech",
      "position": "Goalkeeper"
    },
    {
      "playerId": "ARS02",
      "name": "Santi Cazorla",
      "position": "Midfielder"
    }
  ]
}

我希望能够做的是以下内容,因为我对收集名称不感兴趣:

public class Player
{
    public string playerId { get; set; }
    public string name { get; set; }
    public string position { get; set; }
}

List<Player> cards = JsonConvert.DeserializeObject<List<Player>>(jsonContent);      

这不起作用并产生错误。

  

无法反序列化当前的JSON对象(例如{\“name \”:\“value \”})   进入类型'System.Collections.Generic.List`1 [Player]'因为类型   需要一个JSON数组(例如[1,2,3])才能正确反序列化。修理   此错误要么将JSON更改为JSON数组(例如[1,2,3])或   更改反序列化类型,使其成为正常的.NET类型(例如   不是像整数这样的原始类型,不是像数组那样的集合类型   或者List)可以从JSON对象反序列化。   JsonObjectAttribute也可以添加到类型中以强制它   从JSON对象反序列化。

有没有办法用Newtonsoft.Json完成这个?

3 个答案:

答案 0 :(得分:6)

由于团队名称可变,您需要反序列化为Dictionary<string, List<Player>>。从那里使用SelectMany对字典的值来获取玩家

public class Player
{
    public string playerId { get; set; }
    public string name { get; set; }
    public string position { get; set; }
}

var teams = JsonConvert.DeserializeObject<Dictionary<string, List<Player>>>(jsonContent);
List<Player> players = teams.SelectMany(kvp => kvp.Value).ToList();

答案 1 :(得分:3)

您想要的是将该对象反序列化为字典:

var teams = JsonConvert.DeserializeObject<Dictionary<string, List<Player>>>(jsonContent);

原始对象不是数组,因此将其反序列化为数组或List<T>

是没有意义的

稍后,如果您只想要玩家名单并且不关心俱乐部名称,那么只需使用LINQ&#39; SelectMany来平整字典:

var allPlayers = teams.SelectMany(entry => entry.Value);

答案 2 :(得分:0)

如果您现在只是尝试为玩家创建一个对象,那么它将无法工作,因为团队名称是唯一的。您要反序列化的类应该如下所示:

public class Teams
{
    public Liverpool[] Liverpool { get; set; }
    public Manchesterunited[] ManchesterUnited { get; set; }
    public Arsenal[] Arsenal { get; set; }
}

public class Liverpool
{
    public string playerId { get; set; }
    public string name { get; set; }
    public string position { get; set; }
}

public class Manchesterunited
{
    public string playerId { get; set; }
    public string name { get; set; }
    public string position { get; set; }
}

public class Arsenal
{
    public string playerId { get; set; }
    public string name { get; set; }
    public string position { get; set; }
}

现在您可以直接将数据反序列化为此对象。

Teams teams = JsonConvert.DeserializeObject<Teams>(jsonContent); 

文件菜单修改选项中,可以选择选择专属,此选项可让您创建模仿的类 json或xml 的属性。