C#将多个JSON集合反序列化为一个列表<;T>;

C#将多个JSON集合反序列化为一个列表<;T>;,c#,json,deserialization,C#,Json,Deserialization,我从web api获取同一对象的集合。 然后我想将JSON反序列化为一个列表 JSON如下所示: { "Liverpool": [ { "playerId": "LIV01", "name": "Adam Llana", "position": "Midfielder" }, { "playerId": "LIV02", "name": "Daniel Sturridge", "position"

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

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);      
公共类播放器
{
公共字符串播放器ID{get;set;}
公共字符串名称{get;set;}
公共字符串位置{get;set;}
}
列表卡=JsonConvert.DeserializeObject(jsonContent);
这不起作用并产生错误

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


使用Newtonsoft.Json有什么方法可以做到这一点吗?

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

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); 
Teams=jsoninvert.DeserializeObject(jsonContent);

在顶部的文件菜单中的编辑选项中有一个名为粘贴特殊的选项,该选项允许您创建模仿json或xml属性的类

,因为您需要将变量团队名称反序列化到
字典
。在字典的值上使用
选择many
,以获取玩家

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();
公共类播放器
{
公共字符串播放器ID{get;set;}
公共字符串名称{get;set;}
公共字符串位置{get;set;}
}
var teams=jsoninvert.DeserializeObject(jsonContent);
列出玩家=团队。选择许多(kvp=>kvp.Value)。ToList();

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

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

如果OP有1000个团队需要反序列化呢?如果他们的名字事先不知道怎么办?如果将来将新属性添加到
播放器
,该怎么办?是的,这是此实现的一个问题。感谢您强调此问题。