我从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完成这个?
答案 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 的属性。