【发布时间】:2020-05-01 16:50:11
【问题描述】:
我正在尝试从 API 反序列化 C# 中的嵌套 .json (https://ergast.com/api/f1/current/results.json),但我有点卡住了。我到处寻找解决问题的方法,但还没有发现任何有用的东西,我可能只是不明白它对我有什么帮助,考虑到我是 c# 和 API 的新手,而不是最有经验的程序员。
我在下载原始 .json 的 aspx Page_Load 中调用以下方法,稍微格式化并将其反序列化为 racesCollection。
private static RacesCollection GetRacesFromAPI(WebClient webClient)
{
String JSON = webClient.DownloadString("https://ergast.com/api/f1/current.json?callback=myParser&limit=1000");
JObject data = FormatJSON(ref JSON);
RacesCollection racesCollection = JsonConvert.DeserializeObject<RacesCollection>(data["MRData"]["RaceTable"].ToString());
return racesCollection;
}
..这是种族合集
public class RacesCollection
{
private List<Races> races;
public List<Races> Races { get => races; set => races = value; }
}
..这些是我试图反序列化的类。
public class Races
{
int season;
string round;
string url;
string raceName;
string date;
string time;
public int Season { get => season; set => season = value; }
public string Round { get => round; set => round = value; }
public string Url { get => url; set => url = value; }
public string RaceName { get => raceName; set => raceName = value; }
public string Date { get => date; set => date = value; }
public string Time { get => time; set => time = value; }
public Dictionary<string, Circuit> Circuit { get; set; }
public List<Results> Results { get; set; }
}
public class Circuit
{
string circuitID;
string circuitUrl;
string circuitName;
public string CircuitID { get => circuitID; set => circuitID = value; }
public string CircuitUrl { get => circuitUrl; set => circuitUrl = value; }
public string CircuitName { get => circuitName; set => circuitName = value; }
public Dictionary<string, Location> Location { get; set; }
}
public class Results
{
int number;
int position;
int points;
int grid;
int laps;
string status;
public int Number { get => number; set => number = value; }
public int Position { get => position; set => position = value; }
public int Points { get => points; set => points = value; }
public int Grid { get => grid; set => grid = value; }
public int Laps { get => laps; set => laps = value; }
public string Status { get => status; set => status = value; }
public Dictionary<string, Driver> Driver { get; set; }
public Dictionary<string, Constructor> Constructor { get; set; }
}
public class Driver
{
string driverId;
public string DriverId { get => driverId; set => driverId = value; }
}
public class Constructor
{
string constructorId;
public string ConstructorId { get => constructorId; set => constructorId = value; }
}
public class Location
{
float lat;
float @long;
string locality;
string country;
public float Lat { get => lat; set => lat = value; }
public float Long { get => @long; set => @long = value; }
public string Locality { get => locality; set => locality = value; }
public string Country { get => country; set => country = value; }
}
运行时,一切都正常反序列化,直到它到达 Circuit,这会引发此异常。
Newtonsoft.Json.JsonSerializationException:“将值“albert_park”转换为类型“JSONAPI.Circuit”时出错。路径 'Races[0].Circuit.circuitId',第 10 行,位置 34。'
内部异常 ArgumentException:无法从 System.String 转换或转换为 JSONAPI.Circuit。
如果我能在这方面得到任何帮助,我们将不胜感激。
【问题讨论】:
-
JSON 键应该区分大小写。您的 C# 对象中有
CircuitID,而 JSON 是circuitId。更新你的 C# 对象,看看它是如何工作的。 -
感谢您的建议。不幸的是,它仍然抛出同样的异常。
-
将
public Dictionary<string, Circuit> Circuit { get; set; }更改为public Circuit Circuit { get; set; }电路是 JSON 对象,而不是字典。与电路上的Location相同。 -
谢谢你,肖恩!这行得通。虽然我偶然发现了另一个问题,但我仍然坚持尝试让 Results 工作,因为它是一个数组。使用
public Results Results{ get; set; }不会返回异常,但它只是空值。我尝试过使用public List<Results> Results { get; set; }和System.Collections.ObjectModel.Collection<Results> Results{ get; set; },但它们都不起作用,结果始终为空。 -
没关系,想通了!在我对此感到沮丧的同时,我没有看到我之前粘贴的同一个链接是我尝试使用的同一个链接。无论如何,感谢您的帮助,非常感谢!
标签: c# json api serialization json.net