0

есть код json такого типа:

    {"success": true,
    "data": [
        {
            "id": 40,
            "title": {
                "ru": "Участок Солнцевской линии закрывается с 12 декабря",
                "en": "The section of Line 8A will be out of service from December 12, 2020"
            },
            "description": {
                "ru": "С 12.12.2020 по 22.12.2020 для подключения новых станций к действующей инфраструктуре метро закрывается участок Солнцевской линии от «Савёловской» до «Парка Победы». Будут закрыты четыре станции: «Петровский парк», «ЦСКА», «Хорошёвская» и «Шелепиха». При движении от «Рассказовки» после станции «Парк Победы» поезда пойдут до «Делового центра».",
                "en": "The section of Line 8A, including Petrovskiy Park, CSKA, Khoroshyovskaya, Shelepikha will be closed from December 12 till December 22, 2020 due to the launch of new stations. All trains departing from Rasskazovka station will go to Delovoy Tsentr station."
            },
            "extraSvg": null,
            "startDate": "2020-12-12T02:30:21",
            "endDate": "2020-12-23T02:00:04",
            "stations": [
                {
                    "stationId": 406,
                    "title": {
                        "ru": "Закрытие станции"
                    },
                    "description": {
                        "ru": "С 12.12.2020 по 22.12.2020 «Шелепиха» будет закрыта из-за подключения новых станций к действующей инфраструктуре метро."
                    },
                    "status": "EMERGENCY"
                },
                {
                    "stationId": 404,
                    "title": {
                        "ru": "Закрытие станции"
                    },
                    "description": {
                        "ru": "С 12.12.2020 по 22.12.2020 «ЦСКА» будет закрыта из-за подключения новых станций к действующей инфраструктуре метро."
                    },
                    "status": "EMERGENCY"
                },
                {
                    "stationId": 403,
                    "title": {
                        "ru": "Закрытие станции"
                    },
                    "description": {
                        "ru": "С 12.12.2020 по 22.12.2020 «Петровский парк» будет закрыт из-за подключения новых станций к действующей инфраструктуре метро."
                    },
                    "status": "EMERGENCY"
                },
                {
                    "stationId": 405,
                    "title": {
                        "ru": "Закрытие станции"
                    },
                    "description": {
                        "ru": "С 12.12.2020 по 22.12.2020 «Хорошёвская» будет закрыта из-за подключения новых станций к действующей инфраструктуре метро."
                    },
                    "status": "EMERGENCY"
                }
            ],
            "connections": [],
            "alternativeConnections": [],
            "transitions": []
        },
        {
            "id": 39,
            "title": {
                "ru": "В западном вестибюле станции «Рязанский проспект» закрыт на ремонт эскалатор № 1",
                "en": "Escalator №1 at «Ryazanskiy Prospekt» station is closed for repairs"
            },
            "description": {
                "ru": "В западном вестибюле станции «Рязанский проспект» с 30.11.2020 до 28.12.2020 закрыт на ремонт эскалатор №  1.",
                "en": "Escalator №1 is not under service due to repair on station «Ryazanskiy Prospekt» till 28.12.2020"
            },
            "extraSvg": null,
            "startDate": "2020-11-29T21:00:18",
            "endDate": "2020-12-28T20:00:26",
            "stations": [
                {
                    "stationId": 215,
                    "title": {
                        "ru": "Ремонт эскалатора",
                        "en": "Escalator repair"
                    },
                    "description": {
                        "ru": "До 28.12.2020 на станции закрыт на ремонт эскалатор № 1.",
                        "en": "Escalator №1 is not on service due to repair till 28.12.2020"
                    },
                    "status": "EMERGENCY"
                }
            ],
            "connections": [],
            "alternativeConnections": [],
            "transitions": []
        }]}

Пытаюсь десериализовать так:

     private void button2_Click(object sender, EventArgs e)
        {
            var client = new RestClient("URL");
            client.Timeout = -1;
            var request = new RestRequest(Method.GET);
            IRestResponse response = client.Execute(request);
            richTextBox1.Text = response.Content;
            //Console.WriteLine(response.Content);
            dynamic x = JsonConvert.DeserializeObject(response.Content);
            string noti = x.ResponseData;
            notifications notifications = JsonConvert.DeserializeObject<notifications>(noti);
        }
    public class notifications
    {
        public not_data[] not_data { get; set; }
    }
    public class not_data
    {
        public int id { get; set; }
        public  not_title[] not_title { get; set; }
        public not_description[] not_description { get; set; }
        public string extraSvg { get; set; }
        public string startDate { get; set; }
        public string endDate { get; set; }
        public not_stations[] not_stations { get; set; }


    }
    public class not_title
    {
        public string ru { get; set; }
        public string en { get; set; }
    }
    public class not_description
    {
        public string ru { get; set; }
        public string en { get; set; }
    }
    public class not_stations
    {
        public int stationId { get; set; }
        public not_stations_title[] not_stations_title { get; set; }
        public not_stations_description[] not_stations_description { get; set; }
        public string status { get; set; }
    }
    public class not_stations_title
    {
        public string ru { get; set; }
    }
    public class not_stations_description
    {
        public string ru { get; set; }
    }
}

Но выдает System.ArgumentNullException: Значение не может быть неопределенным. Имя параметра: value в чём проблема кроме криворукости? =) Хочу вывести это в Datatable потом.

  • На какой строчке кода выпадет эта ошибка ? – Pavel Popov Dec 08 '20 at 07:51
  • 4
    А где тут value? И зачем десериализацию делать дважды: сначала dynamic x = JsonConvert.DeserializeObject(response.Content);, а следом notifications = JsonConvert.DeserializeObject<notifications>(noti); ? – Bulson Dec 08 '20 at 08:02
  • у Вас не правильно описанна структура JSON документа. – Yaroslav Dec 08 '20 at 09:47
  • здесь правильное описание https://dotnetfiddle.net/1C1rGu – Yaroslav Dec 08 '20 at 09:53
  • конечно может Вам еще понадобится, переопределить сам конвертер. – Yaroslav Dec 08 '20 at 09:54
  • вот похожая проблема https://stackoverflow.com/questions/58870212/argumentnullexception-in-newtonsoft-json-createobjectusingcreatorwithparameters – Yaroslav Dec 08 '20 at 09:56
  • И мало того, что десериализация дважды - так ещё и в dynamic: просто опишите свои данные и десериализуйте. – A K Dec 08 '20 at 10:50

1 Answers1

0

Самое доступное и быстрое решение, которое я могу вам предложить, это использовать библиотеку Newtonsoft. Библиотеку можно установить через Диспетчер пакетов NuGet в VS.

Далее, приблизительный код выглядит так:

    // Указываю, где лежит Json. Если работаешь через Интернет, то нужно написать WebClient для получения Json.
   string path = @"test.json";

// Записываю в JObject прочитанные данные с диска JObject o1 = JObject.Parse(File.ReadAllText(path));

// Разбиваю строки на массив. Поскольку у вас именно массив var jsonParse = JObject.Parse(o1.ToString())["data"].ToArray();

// Прохожу циклом для вывода на экран foreach (dynamic item in jsonParse) { Block1.Text = item.id; Block2.Text = item.description.ru; }

Рабочее окно с прочитанным документом

  • 1
    Самое доступное и быстрое решение, которое я могу вам предложить но ведь автор его и так использует, прямо в коде в вопросе видно. – aepot Dec 08 '20 at 10:39