在 C# 中将 JSON 反序列化为 API 的对象
Deserialization of JSON in C# into an object for API
我正在尝试从 API 中获取数据以进行作业,但我一直被卡住了。我在 C# 方面相当缺乏经验,之前只真正使用过 Java 和 PHP,但我想说我对两者的经验也相当有限(通过 PHP webforms 简单的 mysqli CRUD 和玩弄Java逻辑,做了一些小游戏等),所以我可能真的不知道我做错了什么或者问题出在哪里。
出于某种原因,JSON 未在以下代码中反序列化。
Console.WriteLine(driversCollection.Drivers.Count);
在尝试计数时总是 returns null。在 visual studio 中设置断点并看到本地原始 JSON 值已更新后,它确实根据我的判断正确下载了 JSON。我认为 JSON 本身格式错误,并尝试使用 Replace 删除反斜杠,但这也不起作用。
这是 link 到 JSON:https://ergast.com/api/f1/drivers.json?callback=myParser
我提前为我的低级代码道歉,这可能是一个简单的解决方案,但我将非常感谢我能得到的任何帮助。
Drivers.cs
public class Drivers
{
string driverID;
int permanentNumber;
string code;
string url;
string givenName;
string familyName;
string dateOfBirth;
string nationality;
public string DriverID { get => driverID; set => driverID = value; }
public int PermanentNumber { get => permanentNumber; set => permanentNumber = value; }
public string Code { get => code; set => code = value; }
public string Url { get => url; set => url = value; }
public string GivenName { get => givenName; set => givenName = value; }
public string FamilyName { get => familyName; set => familyName = value; }
public string DateOfBirth { get => dateOfBirth; set => dateOfBirth = value; }
public string Nationality { get => nationality; set => nationality = value; }
}
DriversCollection.cs
public class DriversCollection
{
private List<Drivers> drivers;
public List<Drivers> Drivers { get => drivers; set => drivers = value; }
}
ReadJSON.aspx.cs
public partial class ReadJSON : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
using (var webClient = new WebClient())
{
String rawJSON = webClient.DownloadString("http://ergast.com/api/f1/2019/drivers.json?callback=myParser&limit=1000");
String editedJSON = rawJSON.Remove(rawJSON.Length - 1, 1);
editedJSON = editedJSON.Remove(0, 9);
editedJSON = editedJSON.Replace(@"\/", "/");
editedJSON = editedJSON.Replace(@"\", string.Empty);
DriversCollection driversCollection = JsonConvert.DeserializeObject<DriversCollection>(editedJSON);
Console.WriteLine(driversCollection.Drivers.Count);
}
}
}
问题是,当 JSON 与从服务器返回的 MRData 对象不兼容时,您将返回的 JSON 投射到 DriversCollection class 中。您想要 MRData.DriverTable.Drivers,但正在尝试获取 MRData.Drivers
您可以通过先将其解析为 JObject,然后从该 JObject 反序列化 DriverTable 来实现。
using (var webClient = new WebClient())
{
String rawJSON = webClient.DownloadString("http://ergast.com/api/f1/2019/drivers.json?callback=myParser&limit=1000");
String editedJSON = rawJSON.Remove(rawJSON.Length - 1, 1);
editedJSON = editedJSON.Remove(0, 9);
editedJSON = editedJSON.Replace(@"\/", "/");
editedJSON = editedJSON.Replace(@"\", string.Empty);
JObject data = JObject.Parse(editedJSON);
DriversCollection driversCollection = JsonConvert.DeserializeObject<DriversCollection>(data["MRData"]["DriverTable"].ToString());
Console.WriteLine(driversCollection.Drivers.Count);
}
我正在尝试从 API 中获取数据以进行作业,但我一直被卡住了。我在 C# 方面相当缺乏经验,之前只真正使用过 Java 和 PHP,但我想说我对两者的经验也相当有限(通过 PHP webforms 简单的 mysqli CRUD 和玩弄Java逻辑,做了一些小游戏等),所以我可能真的不知道我做错了什么或者问题出在哪里。
出于某种原因,JSON 未在以下代码中反序列化。
Console.WriteLine(driversCollection.Drivers.Count);
在尝试计数时总是 returns null。在 visual studio 中设置断点并看到本地原始 JSON 值已更新后,它确实根据我的判断正确下载了 JSON。我认为 JSON 本身格式错误,并尝试使用 Replace 删除反斜杠,但这也不起作用。
这是 link 到 JSON:https://ergast.com/api/f1/drivers.json?callback=myParser
我提前为我的低级代码道歉,这可能是一个简单的解决方案,但我将非常感谢我能得到的任何帮助。
Drivers.cs
public class Drivers
{
string driverID;
int permanentNumber;
string code;
string url;
string givenName;
string familyName;
string dateOfBirth;
string nationality;
public string DriverID { get => driverID; set => driverID = value; }
public int PermanentNumber { get => permanentNumber; set => permanentNumber = value; }
public string Code { get => code; set => code = value; }
public string Url { get => url; set => url = value; }
public string GivenName { get => givenName; set => givenName = value; }
public string FamilyName { get => familyName; set => familyName = value; }
public string DateOfBirth { get => dateOfBirth; set => dateOfBirth = value; }
public string Nationality { get => nationality; set => nationality = value; }
}
DriversCollection.cs
public class DriversCollection
{
private List<Drivers> drivers;
public List<Drivers> Drivers { get => drivers; set => drivers = value; }
}
ReadJSON.aspx.cs
public partial class ReadJSON : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
using (var webClient = new WebClient())
{
String rawJSON = webClient.DownloadString("http://ergast.com/api/f1/2019/drivers.json?callback=myParser&limit=1000");
String editedJSON = rawJSON.Remove(rawJSON.Length - 1, 1);
editedJSON = editedJSON.Remove(0, 9);
editedJSON = editedJSON.Replace(@"\/", "/");
editedJSON = editedJSON.Replace(@"\", string.Empty);
DriversCollection driversCollection = JsonConvert.DeserializeObject<DriversCollection>(editedJSON);
Console.WriteLine(driversCollection.Drivers.Count);
}
}
}
问题是,当 JSON 与从服务器返回的 MRData 对象不兼容时,您将返回的 JSON 投射到 DriversCollection class 中。您想要 MRData.DriverTable.Drivers,但正在尝试获取 MRData.Drivers
您可以通过先将其解析为 JObject,然后从该 JObject 反序列化 DriverTable 来实现。
using (var webClient = new WebClient())
{
String rawJSON = webClient.DownloadString("http://ergast.com/api/f1/2019/drivers.json?callback=myParser&limit=1000");
String editedJSON = rawJSON.Remove(rawJSON.Length - 1, 1);
editedJSON = editedJSON.Remove(0, 9);
editedJSON = editedJSON.Replace(@"\/", "/");
editedJSON = editedJSON.Replace(@"\", string.Empty);
JObject data = JObject.Parse(editedJSON);
DriversCollection driversCollection = JsonConvert.DeserializeObject<DriversCollection>(data["MRData"]["DriverTable"].ToString());
Console.WriteLine(driversCollection.Drivers.Count);
}