C# 如何使用Yahoo Api中的索引解析json数组
鉴于Yahoo API的这一响应,我试图使用Newtonsoft.Json和ASP.NET/C#解析其中的玩家。我还想在最后检查C# 如何使用Yahoo Api中的索引解析json数组,c#,json,json.net,C#,Json,Json.net,鉴于Yahoo API的这一响应,我试图使用Newtonsoft.Json和ASP.NET/C#解析其中的玩家。我还想在最后检查count的值 { "fantasy_content": { "xml:lang": "en-US", "yahoo:uri": "/fantasy/v2/game/nfl/players", "game": [ { "game_key": "390", "game_id": "390",
count
的值
{
"fantasy_content": {
"xml:lang": "en-US",
"yahoo:uri": "/fantasy/v2/game/nfl/players",
"game": [
{
"game_key": "390",
"game_id": "390",
"name": "Football",
"code": "nfl",
"type": "full",
"url": "https://football.fantasysports.yahoo.com/f1",
"season": "2019",
"is_registration_over": 0,
"is_game_over": 0,
"is_offseason": 0
},
{
"players": {
"0": {
"player": [
[
{
"player_key": "390.p.30972"
},
{
"player_id": "30972"
},
{
"name": {
"full": "Saquon Barkley",
"first": "Saquon",
"last": "Barkley",
"ascii_first": "Saquon",
"ascii_last": "Barkley"
}
},
{
"editorial_player_key": "nfl.p.30972"
},
{
"editorial_team_key": "nfl.t.19"
},
{
"editorial_team_full_name": "New York Giants"
},
{
"editorial_team_abbr": "NYG"
},
{
"bye_weeks": {
"week": "11"
}
},
{
"uniform_number": "26"
},
{
"display_position": "RB"
},
{
"headshot": {
"url": "https://s.yimg.com/iu/api/res/1.2/RtPm7fdFHthz1._DrpkAqA--~C/YXBwaWQ9eXNwb3J0cztjaD0yMzM2O2NyPTE7Y3c9MTc5MDtkeD04NTc7ZHk9MDtmaT11bGNyb3A7aD02MDtxPTEwMDt3PTQ2/https://s.yimg.com/xe/i/us/sp/v/nfl_cutout/players_l/09242018/30972.png",
"size": "small"
},
"image_url": "https://s.yimg.com/iu/api/res/1.2/RtPm7fdFHthz1._DrpkAqA--~C/YXBwaWQ9eXNwb3J0cztjaD0yMzM2O2NyPTE7Y3c9MTc5MDtkeD04NTc7ZHk9MDtmaT11bGNyb3A7aD02MDtxPTEwMDt3PTQ2/https://s.yimg.com/xe/i/us/sp/v/nfl_cutout/players_l/09242018/30972.png"
},
{
"is_undroppable": "0"
},
{
"position_type": "O"
},
[],
{
"eligible_positions": [
{
"position": "RB"
}
]
},
[],
[],
[]
]
]
},
"1": {
"player": [
[
{
"player_key": "390.p.29238"
},
{
"player_id": "29238"
},
{
"name": {
"full": "Ezekiel Elliott",
"first": "Ezekiel",
"last": "Elliott",
"ascii_first": "Ezekiel",
"ascii_last": "Elliott"
}
},
{
"editorial_player_key": "nfl.p.29238"
},
{
"editorial_team_key": "nfl.t.6"
},
{
"editorial_team_full_name": "Dallas Cowboys"
},
{
"editorial_team_abbr": "Dal"
},
{
"bye_weeks": {
"week": "8"
}
},
{
"uniform_number": "21"
},
{
"display_position": "RB"
},
{
"headshot": {
"url": "https://s.yimg.com/iu/api/res/1.2/.0ocryeNkGmnFWlYOhT4hw--~C/YXBwaWQ9eXNwb3J0cztjaD0yMzM2O2NyPTE7Y3c9MTc5MDtkeD04NTc7ZHk9MDtmaT11bGNyb3A7aD02MDtxPTEwMDt3PTQ2/https://s.yimg.com/xe/i/us/sp/v/nfl_cutout/players_l/09272018/29238.png",
"size": "small"
},
"image_url": "https://s.yimg.com/iu/api/res/1.2/.0ocryeNkGmnFWlYOhT4hw--~C/YXBwaWQ9eXNwb3J0cztjaD0yMzM2O2NyPTE7Y3c9MTc5MDtkeD04NTc7ZHk9MDtmaT11bGNyb3A7aD02MDtxPTEwMDt3PTQ2/https://s.yimg.com/xe/i/us/sp/v/nfl_cutout/players_l/09272018/29238.png"
},
{
"is_undroppable": "0"
},
{
"position_type": "O"
},
[],
{
"eligible_positions": [
{
"position": "RB"
}
]
},
[],
[],
[]
]
]
},
"2": {
"player": [
[
{
"player_key": "390.p.30180"
},
{
"player_id": "30180"
},
{
"name": {
"full": "Alvin Kamara",
"first": "Alvin",
"last": "Kamara",
"ascii_first": "Alvin",
"ascii_last": "Kamara"
}
},
{
"editorial_player_key": "nfl.p.30180"
},
{
"editorial_team_key": "nfl.t.18"
},
{
"editorial_team_full_name": "New Orleans Saints"
},
{
"editorial_team_abbr": "NO"
},
{
"bye_weeks": {
"week": "9"
}
},
{
"uniform_number": "41"
},
{
"display_position": "RB"
},
{
"headshot": {
"url": "https://s.yimg.com/iu/api/res/1.2/loANJKjPdmUu1gM1jyKK1A--~C/YXBwaWQ9eXNwb3J0cztjaD0yMzM2O2NyPTE7Y3c9MTc5MDtkeD04NTc7ZHk9MDtmaT11bGNyb3A7aD02MDtxPTEwMDt3PTQ2/https://s.yimg.com/xe/i/us/sp/v/nfl_cutout/players_l/08252018/30180.png",
"size": "small"
},
"image_url": "https://s.yimg.com/iu/api/res/1.2/loANJKjPdmUu1gM1jyKK1A--~C/YXBwaWQ9eXNwb3J0cztjaD0yMzM2O2NyPTE7Y3c9MTc5MDtkeD04NTc7ZHk9MDtmaT11bGNyb3A7aD02MDtxPTEwMDt3PTQ2/https://s.yimg.com/xe/i/us/sp/v/nfl_cutout/players_l/08252018/30180.png"
},
{
"is_undroppable": "0"
},
{
"position_type": "O"
},
[],
{
"eligible_positions": [
{
"position": "RB"
}
]
},
[],
[],
[]
]
]
},
"count": 3
}
}
],
"time": "181.84494972229ms",
"copyright": "Data provided by Yahoo! and STATS, LLC",
"refresh_rate": "60"
}
}
有两件事让我很反感
游戏
是一个看起来很奇怪的数组0:{玩家:{//dah-dah-dah}
var jObject = JObject.Parse(await response.Content.ReadAsStringAsync());
if (jObject.ContainsKey("players"))
{
var yPs = jObject["players"].ToObject<YahooPlayerListJson>();
yPlayerList.AddRange(yPs.YPlayers);
if(yPs.Count < 25) { f = 5000; }
}
var jObject=jObject.Parse(wait response.Content.ReadAsStringAsync());
if(jObject.ContainsKey(“玩家”))
{
var yPs=jObject[“players”].ToObject();
yPlayerList.AddRange(yPs.YPlayers);
如果(yPs.Count<25){f=5000;}
}
但是索引给我带来了困难。我如何解析这个JSON呢?呃,这是一个非常糟糕的JSON格式。异构数组使得使用它特别困难。在我看来,这个数据转换得很糟糕如果是这样的话,直接使用XML可能更简单。在任何情况下,我们都可以让它工作。下面是我将采取的方法
public class Player
{
public string PlayerKey { get; set; }
public string PlayerId { get; set; }
public Name Name { get; set; }
public string EditorialPlayerKey { get; set; }
public string EditorialTeamKey { get; set; }
public string EditorialTeamFullName { get; set; }
public string EditorialTeamAbbr { get; set; }
public Week ByeWeeks { get; set; }
public string UniformNumber { get; set; }
public string DisplayPosition { get; set; }
public Photo Headshot { get; set; }
public string ImageUrl { get; set; }
public string IsUndroppable { get; set; }
public string PositionType { get; set; }
public Position[] EligiblePositions { get; set; }
}
public class Name
{
public string Full { get; set; }
public string First { get; set; }
public string Last { get; set; }
}
public class Photo
{
public string Url { get; set; }
public string Size { get; set; }
}
public class Week
{
[JsonProperty("week")]
public int Number { get; set; }
}
public class Position
{
[JsonProperty("position")]
public string Name { get; set; }
}
snake_案例
属性名称到C#类中的ProperCase
属性名称的转换
玩家列表
,如下所示
这里我使用递归下降表达式作为向下搜索player
对象的快捷方式。JSON中的每个player实际上是一个包含混合内容数组的数组,其中内容由一些对象组成,每个对象包含一个不同的属性,还有一些无用的空数组。因此,我过滤内部数组只包含真实数据的对象,然后使用将其所有属性收集到一个平面可枚举的,然后将其放入一个临时作业对象。从那里,我使用前面配置的序列化程序从作业对象创建一个新的播放器实例,并返回播放器>以便将其放入结果列表中
List<Player> players =
root.SelectTokens("$..player")
.Select(jt =>
{
JObject tempObj = new JObject(
jt.Children<JArray>()
.First()
.Children<JObject>()
.SelectMany(jo => jo.Properties())
);
return tempObj.ToObject<Player>(serializer);
})
.ToList();
这是一个正在运行的演示:谢谢Brian,我刚从一个短暂的假期回来。我很高兴尝试一下。是的,你是对的,yahoo的默认格式是XML,但是他们提供了(糟糕的)相同数据的json格式。你知道有任何与Newtonsoft.json等效的XML读取器/解析器吗?无论哪种方式,都会在接下来的几天内尝试一下,谢谢你的详细回答。我在发帖后已经接近这个问题,但在arraysYes方面仍然有困难。是的,如果你想将XML反序列化到类结构中e您可以使用该类;如果您更喜欢LINQ样式的查询来从XML提取数据,请看一看。两者都是.Net framework的一部分,因此您不需要任何额外的库。太棒了!它工作得很好!不知道如何在命名约定(“$…player”等)中使用令牌。非常感谢您的帮助!
string json = await response.Content.ReadAsStringAsync();
JObject root = JObject.Parse(json);
List<Player> players =
root.SelectTokens("$..player")
.Select(jt =>
{
JObject tempObj = new JObject(
jt.Children<JArray>()
.First()
.Children<JObject>()
.SelectMany(jo => jo.Properties())
);
return tempObj.ToObject<Player>(serializer);
})
.ToList();
int playerCount = (int)root.SelectToken("$..players.count");
if (players.Count != playerCount)
throw new Exception("The number of players in the list does not match the player count!");