在 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);
        }