从复杂的JSON数据C#进行Linq查询时遇到问题



我正在尝试从NBA API查询JSON数据以创建List,这样我就可以将范围添加到我的DB中。.SelectMany语句只返回一个变量我没有构建错误,但在运行代码时遇到错误。我相信错误在于我的陈述,但我不确定。我似乎在谷歌上找不到答案。

如果有任何帮助,我将不胜感激。附件是我的Linq查询、JSON数据和游戏类。

Linq查询:

var json = response.Content;
JObject jObject = JObject.Parse(json);
List<Game> games = (from g in jObject["api"]["games"]

select new Game(
(int)g["gameId"],
(string)g["startTimeUTC"],
null,
(int)g["hTeam"]["teamId"],
(int)g["vTeam"]["teamId"],

(int)g["hTeam"]["score"]["points"],  // getting error here "input string invalid"
(int)g["vTeam"]["score"]["points"])).ToList();

JSON数据

{"api":{"status":200,"message":"GET games/seasonYear/2020","results":1168,"filters":["seasonYear","league","gameId","teamId","date","live"],"games":[{"seasonYear":"2020","league":"standard","gameId":"8133","startTimeUTC":"2020-12-12T00:00:00.000Z","endTimeUTC":"2020-12-12T02:29:00.000Z","arena":"State Farm Arena","city":"Atlanta","country":"USA","clock":"","gameDuration":"2:19","currentPeriod":"4/4","halftime":"0","EndOfPeriod":"0","seasonStage":"1","statusShortGame":"3","statusGame":"Finished","vTeam":{"teamId":"26","shortName":"ORL","fullName":"Orlando Magic","nickName":"Magic","logo":"https://upload.wikimedia.org/wikipedia/fr/b/bd/Orlando_Magic_logo_2010.png","score":{"points":"116"}},"hTeam":{"teamId":"1","shortName":"ATL","fullName":"Atlanta Hawks","nickName":"Hawks","logo":"https://upload.wikimedia.org/wikipedia/fr/e/ee/Hawks_2016.png","score":{"points":"112"}}},{"seasonYear":"2020","league":"standard","gameId":"8134","startTimeUTC":"2020-12-12T00:00:00.000Z","endTimeUTC":"2020-12-12T02:32:00.000Z","arena":"Little Caesars Arena","city":"Detroit","country":"USA","clock":"","gameDuration":"2:19","currentPeriod":"4/4","halftime":"0","EndOfPeriod":"0","seasonStage":"1","statusShortGame":"3","statusGame":"Finished","vTeam":{"teamId":"24","shortName":"NYK","fullName":"New York Knicks","nickName":"Knicks","logo":"https://upload.wikimedia.org/wikipedia/fr/d/dc/NY_Knicks_Logo_2011.png","score":{"points":"90"}},"hTeam":{"teamId":"10","shortName":"DET","fullName":"Detroit Pistons","nickName":"Pistons","logo":"https://upload.wikimedia.org/wikipedia/en/thumb/1/1e/Detroit_Pistons_logo.svg/1200px-Detroit_Pistons_logo.svg.png","score":{"points":"84"}}},{"seasonYear":"2020","league":"standard","gameId":"8135","startTimeUTC":"2020-12-12T01:00:00.000Z","endTimeUTC":"2020-12-12T03:23:00.000Z","arena":"United Center","city":"Chicago","country":"USA","clock":"","gameDuration":"2:09","currentPeriod":"4/4","halftime":"0","EndOfPeriod":"0","seasonStage":"1","statusShortGame":"3","statusGame":"Finished","vTeam":{"teamId":"14","shortName":"HOU","fullName":"Houston Rockets","nickName":"Rockets","logo":"https://upload.wikimedia.org/wikipedia/fr/thumb/d/de/Houston_Rockets_logo_2003.png/330px-Houston_Rockets_logo_2003.png","score":{"points":"125"}},"hTeam":{"teamId":"6","shortName":"CHI","fullName":"Chicago Bulls","nickName":"Bulls","logo":"https://upload.wikimedia.org/wikipedia/fr/thumb/d/d1/Bulls_de_Chicago_logo.svg/1200px-Bulls_de_Chicago_logo.svg.png","score":{"points":"104"}}}]}}

游戏类

public class Game
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
[JsonProperty(PropertyName = "gameId")]
public int GameID { get; set; }
[Required]
[JsonProperty(PropertyName = "startTimeUTC")]
public DateTime Date { get; set; }
public bool? Favorite { get; set; }

[JsonProperty(PropertyName = "api/games/hTeam/score/points")]
public int HomeScore { get; set; }
[JsonProperty(PropertyName = "api/games/vTeam/score/points")]
public int AwayScore { get; set; }
public int TotalScore
{
get
{ return (HomeScore + AwayScore); }
}
[Required]
[JsonProperty(PropertyName = "api/games/hTeam/teamId")]
public int HomeID { get; set; }
[NotMapped]
[ForeignKey("HomeID")]
public Team HomeTeam {get; set;}
[Required]
[JsonProperty(PropertyName = "api/games/vTeam/teamId")]
public int AwayID { get; set; }
[NotMapped]
[ForeignKey("AwayID")]
public Team AwayTeam { get; set; }
public List<GameBet> GameBet { get; set; }
public List<PlayerGame> PlayerGame { get; set; }
public Game(int gameId, DateTime date, bool? favorite, int homeID, int awayID, int homeScore, int awayScore) 
{
this.GameID = gameId;
this.Date = date;
this.Favorite = favorite;
this.HomeScore = homeScore;
this.AwayScore = awayScore;
this.HomeID = homeID;
this.AwayID = awayID;
this.GameBet = new List<GameBet>();
this.PlayerGame = new List<PlayerGame>();
}
public Game() { }
}

该类似乎与json字符串不匹配。

我生成了一组与您的json字符串匹配的类。您可以在此处找到并根据需要添加属性。然后,您可以访问游戏并简单地使用键入的类而不是使用Jobject进行评分。

示例:

var rootObject = JsonConvert.DeserializeObject<Rootobject>(json);
var games = rootObject.api.games;
foreach (var g in games)
{
var score = g.vTeam.score.points;
Console.WriteLine($"{g.city}  {score}");
}

最新更新