Десериализация JSON в C# в объект для API - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь получить данные из API для назначения, но я застрял на этом пути. Я довольно неопытен в C# и раньше действительно использовал только Java и PHP, но я бы сказал, что мой опыт работы с обоими также довольно ограничен (простой CRUD mysqli через PHP веб-формы и игра с Java logi c, сделал несколько небольших игр и т. д. c.), поэтому я, вероятно, не совсем понимаю, что я делаю неправильно или в чем проблема.

По какой-то причине JSON не десериализовано в приведенном ниже коде.

Console.WriteLine(driversCollection.Drivers.Count); всегда возвращает ноль при попытке его подсчитать. Он действительно правильно загружает JSON, исходя из того, что я мог сказать после того, как установил точку останова в visual studio и увидел, что локальное значение JSON было обновлено. Я считаю, что JSON сам по себе неправильно отформатирован и пытался удалить обратную косую черту с помощью Replace, что также не работает.

Это ссылка на 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);
            }
        }
    }

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

Вы можете достичь этого, сначала проанализировав его в JObject, а затем десериализовав DriverTable из этого JObject.

 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);
        }
0 голосов
/ 21 апреля 2020

Проблема в том, что вы приводите JSON, который вы возвращаете в класс DriversCollection, когда JSON несовместим с объектом MRData, который вы возвращаете с сервера. Вы хотите MRData.DriverTable.Drivers, но пытаетесь получить MRData.Drivers

...