Перейти к содержимому

Сериализация-десериализация JSON в C#

Краткий экскурс

Фактически каждый программист рано (или поздно) сталкивается с сериализацией.

Сериализация — это процесс перевода структуры данных в последовательность битов, или же в другую структуру данных, которую удобно хранить, передавать.

Десериализация — это обратный процесс. Процесс преобразования сериализованных данных в структуру данных.

c#_json
Подобные вещи часто встречаются при обмене данными между клиентом и сервером, между двумя клиентами (P2P). В общем много где встречается. Моё первое знакомство было при работе с API одного из российских сервисов.

API — это Application Programming Interface. То есть прослойка между функциональной частью какого-либо программного обеспечения и вашего программного обеспечения.

Например — Вам хочется написать программу, которая будет отображать погоду в Москве. Вам не хочется устанавливать свои метеодатчики и  другое оборудование.

Допустим, что есть сервис «Погода в России», который имеет свой API. И данный сервис на бесплатно (или же платно) дает доступ к нему вашим приложениям. Конечно — всегда можно написать парсер нужной страницы и выводить информацию. Но любые изменения в содержимом страницы могут привести к тому, что парсер придется тоже обновлять.

Глупо говорить о преимуществах API по сравнению с парсингом. Это скорость, удобство работы, а также, очень часто, более расширенный функционал.

Так что если сервис предлагает API — глупо отказываться.

 

Сериализация

В данном примере мы рассмотрим библиотеку «Newtonsoft.Json» для работы с JSON. Почему её? Потому что она удобная.

Для начала её нужно добавить в references.

Для этого нужно нажать ПКМ на References и выбрать «Добавить ссылку…».

referencesAdd

 

Тут можно найти его в поиске (если уже использовали), скачать его через NuGet, или же просто добавить как обычную библиотеку через «Обзор».

referencesAdd2

На всякий случай оставлю библиотеку тут: скачать Newtonsoft.Json.dll.

Теперь можно приступить к коду.

Для начала нужно добавить NameSpace библиотеки в код. Для этого добавим в using следующую строку:

Теперь нужно описать класс, который будем сериализовать и десериализовать:

Будем считать, что пишем программу для ведения учета домашней музыкальной коллекции. Базовый класс — MyMusic, вспомогательный класс — Track.

Теперь добавим несколько треков:

Теперь сериализуем этот класс и выведем на RichTextBox:

В результате чего мы должны получить такую строку на выходе:

 

Десериализация

Теперь нужно эту строку десериализовать обратно в класс. Для этого, естественно, должен быть объявлен соответствующий класс, иначе программа не сможет ничего десериализовать.

Сам код десериализации следующий:

Теперь выведем на экран содержимое десериализованного JSON’а:

На экран должно вывестись следующий текст:

Как видите — с JSON очень удобно работать. Но есть одна маленькая хитрость, которая сильно упростит вашу жизнь при десериализации. Чтобы вам вручную не создавать огромные классы анализируя пример JSON’а, который вам возвращает API — можно его сгенерировать автоматически. В этом вам поможет сайт Json2CSharp. Просто вставьте в него строку с JSON, которую вы получили из API и он сгенерирует вам необходимые классы. Основной класс будет всегда RootObject (в примере был MyMusic), но никто не мешает вам его переименовать в нужный.

 

Скачать весь проект в 7Z-архиве.

Пароль к архиву: котодомик.рф

Update 08.07.2019

Важный момент.

Класс, который Вы хотите сериализовать/десериализовать, должен соответствовать некоторым требованиям, чтобы не было проблем при работе с ним:

  1. У класса должен быть обязательно объявлен конструктор без параметров, или не объявлено конструкторов вовсе;
  2. Лучше использовать свойства, а не поля (с {get; и set;} как в примерах выше;
  3. Если у свойства отсутствует get’тер, или set’тер — то будьте готовы к тому, что часть функционала JSON-сериализатора будет работать не верно. Например:
    1. У вас отсутствует публичный GET’тер, но есть SET’тер. Тогда вы сможете десериализовать (JSON в объект) свойство объекта, но сериализовать (объект в JSON) его вы не сможете;
    2. У вас отсутствует публичный SET’тер, но есть GET’тер. Тогда вы не сможете десериализовать (JSON в объект) свойство объекта, но сможете его сериализовать (объект в JSON);

Метки:

62 комментария для “Сериализация-десериализация JSON в C#”

    1. Рад был помочь. Если интересует какая тема — спрашивайте. Попробую ответить, или напишу статью на эту тему

  1. {«response»:{«count»:142,»items»:[{«id»:409380064,»owner_id»:275756326,»artist»:»Денис Гавриков — Это Воркаут! Часть 2! май 2013!»,»title»:»Deny Montana — Это Воркаут! Часть 2! май 2013!»,»duration»:160,»date»:1445583874,»url»:»http:\/\/cs1-35v4.vk-cdn.net\/p8\/fe3b177abd79dc.mp3?extra=gOYSch6IF6dd87vQc1CaGkyOqMoyDRIIFAjZKy3W9rZTLyjOhGv60ulqeYhObGn6zFTbI54xUAUJUCodWxz9uxUn16fKFzUDvw»,»lyrics_id»:88931895},{«id»:408292793,»owner_id»:275756326,»artist»:»Deny Montana feat. Влад Астахов»,»title»:»Общая цель»,»duration»:216,»date»:1445231408,»url»:»http:\/\/cs1-39v4.vk-cdn.net\/p8\/2312dddb151351.mp3?extra=cFSi9EO0ZUkIgqumZxelQO4Rj_69ORXudBrkH9N7Jlxgh9sbyHK6ByKxS0mqNeqFRLL3sPveQ480gYp8lsqYicBhH7y12DEhGw»,»genre_id»:18},{«id»:407895853,»owner_id»:275756326,»artist»:»Влад Астахов «,»title»:»Время пришло (RamzeS beat prod.)»,»duration»:253,»date»:1445103868,»url»:»http:\/\/cs1-36v4.vk-cdn.net\/p10\/63086d9f12eb28.mp3?extra=WK09V3oizknRTt-zJyN2iysOUeB6GExVK8KSOZEq1nofYJZLJ7LvSfaMctBqIEJk0eowBSJdMqvKOoB8j8STz2uZxCc8UH1b_A»,»album_id»:65283370,»genre_id»:18},{«id»:407895683,»owner_id»:275756326,»artist»:»Влад Астахов»,»title»:»развивайся,тренируйся,занимайся!!!!»,»duration»:235,»date»:1445103833,»url»:»http:\/\/cs1-41v4.vk-cdn.net\/p14\/b89080e0e55495.mp3?extra=O8e8YJwreYvyTCtNJAy3QZ801HJCz6OdFRXG8oJHxUIALRA-HnxBFthkSDJNw79arK4_0N8otgzWvyaBLwtTwL2vIbilWigadQ»,»lyrics_id»:25933590,»album_id»:65283370,»genre_id»:18},{«id»:407894960,»owner_id»:275756326,»artist»:»Музыка для тренировки»,»title»:»#19″,»duration»:296,»date»:1445103703,»url»:»http:\/\/cs1-41v4.vk-cdn.net\/p13\/a3625f66159cf6.mp3?extra=5h3HI6py_uCPtxY3mwHtYBKNlYIkJMAFLl7AYPlE0qpoRGd10T4teJt_mTyCN6eDuIvcUu_pGLN67uLcLaEbUDn5iFCTHHXCeg»,»lyrics_id»:36905917,»album_id»:65283370,»genre_id»:18},{«id»:407885530,»owner_id»:275756326,»artist»:»Музыка для тренеровок»,»title»:»11″,»duration»:196,»date»:1445102028,»url»:»http:\/\/cs1-39v4.vk-cdn.net\/p4\/ddba36bec4a978.mp3?extra=2Gn065GuhxyAm5hXezsMveCmFz_zoZDb3zWjVcaSiFYUHOJ2zfM0BeezOZGe8jg3V9-o82Bi4RyZM0dUH0wyILImTgsb3xSWYA»,»lyrics_id»:154201781,»album_id»:65283370,»genre_id»:18},{«id»:407885484,»owner_id»:275756326,»artist»:»музыка для тренировки «,»title»:»300 Violins Orchestra»,»duration»:174,»date»:1445102019,»url»:»http:\/\/cs4784.vk.me\/u64300308\/audios\/07bca5c6fc4f.mp3?extra=ePuhb68KESWpplVPir74zA-UTVtj3mfre__VaaHqj7waFlrsKiAYnO1fSWBmRZWtQxGkxsim759le8DJ0r7-3ktiWt-K4Dt9MA»,»album_id»:65283370,»genre_id»:18},{«id»:407885447,»owner_id»:275756326,»artist»:»музыка для тренировки «,»title»:»Мотивация 17″,»duration»:214,»date»:1445102011,»url»:»http:\/\/cs4720.vk.me\/u11400608\/audios\/6ef47795f45c.mp3?extra=95Z4pmnUL4EQyE3909CgwLBJMFMtuPx7T06B0k-aJwpd90WPoTpfuFwfUfnZz1lFuDXgvd7JsGwp8YWDO2BSweV1z-8aaFNFyw»,»lyrics_id»:154221731,»album_id»:65283370,»genre_id»:3},{«id»:407885331,»owner_id»:275756326,»artist»:»Deny Montana (DSL) «,»title»:»Это воркаут!»,»duration»:194,»date»:1445101984,»url»:»http:\/\/cs4810.vk.me\/u49807585\/audios\/1f16e9d053d7.mp3?extra=tGiwGPDxcEZc84AwEHkaqPYSQ8HoyRTQ3QQjAsJr-pSjSOgYSwP0x_3kFIsLYlXsf2YgMsOihHAyU5YJVHs7sMxgQqSd8-wFLQ»,»lyrics_id»:16022577,»album_id»:65283370,»genre_id»:18},{«id»:407723204,»owner_id»:275756326,»artist»:»Dj Олежка»,»title»:»Занято нахуй!»,»duration»:29,»date»:1445065492,»url»:»http:\/\/cs422316.vk.me\/u298959881\/audios\/2e0c49805bb3.mp3?extra=LTEuIT701PNQgwP4QbrEOT3E5W354Uffh_CmaBNuG9PF_HJOc-c4pECrGXF7Gg6k2CSON3VvXcCfrzl2GrmteIECn3Nc_jNPYw»,»genre_id»:18}]}}F_HJOc-c4pE6lGXF7Gg6k2CSON3VvXcCfrzl2Gr2uLtdRznZSrGdPNA»,»genre»:18}]}

    Не получается распарсить по примеру(

    1. Здравствуйте! В данной строке ОЧЕНЬ много ошибок! То что я увидел на первый взгляд — это то, что используются наклонные кавычки, а должны быть только обычные двойные.
      Попробуйте прогнать вашу строку через этот сайт — вы поймете о чем я говорю:
      http://json.parser.online.fr/

  2. Спасибо! Давно хотел разобраться с этим и мне очень помогло! Особенно респект за ссылку на Json2CSharp.

  3. Здравствуйте, мне приходит с сервера такой JSON
    {
    «response»:[{
    «id»:210700286,
    «first_name»:»Lindsey»,
    «last_name»:»Stirling»,
    «bdate»:»21.9.1986″
    }]
    }

    т.е всего по 1 переменной, и мне нужно все раз разбить этот массив на переменные, можно ли это сделать используя чуть меньше кода на такую незначимую операцию…

    1. Здравствуйте.
      Сделать то, конечно, можно. Используя string.split, но нужно ли?
      Правильный подход — использовать десериализатор, даже если он нужен в одном случае.
      Возможно появится необходимость считать какие-либо новые данные, в случае со сплитами это будет проблемой.

      Вот классы, которые вам будут нужны для работы с данным JSON-ом:

      И рабочий код для получения класса:

  4. Есть список 21 CheckBox
    myCollection.Select[2] = new SelectScan()
    {
    name = «Голые»,
    status = goloshi_s.Checked,
    };

    Дисс как в примере
    JsonNet SelectScan = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(@»C:/OpenServer/domains/localhost/ahk/profile.json»));
    foreach (var select in SelectScan.Select)
    {

    vip_s.Checked = select.status;
    pochet_s.Checked = select.status;
    goloshi_s.Checked = select.status;
    medics_s.Checked = select.status;
    zakonniki_s.Checked = select.status;
    reporteru_s.Checked = select.status;
    advokatu_s.Checked = select.status;
    taksistu_s.Checked = select.status;
    noobu_s.Checked = select.status;
    yakudza_s.Checked = select.status;
    lcn_s.Checked = select.status;
    rm_s.Checked = select.status;
    lsv_s.Checked = select.status;
    bg_s.Checked = select.status;
    gsf_s.Checked = select.status;
    lz_s.Checked = select.status;
    sr_s.Checked = select.status;
    sfr_s.Checked = select.status;
    tm_s.Checked = select.status;
    ha_s.Checked = select.status;
    bk_s.Checked = select.status;
    }
    Если все значения true — все норм грузиться если хоть 1 = false — ничего не загружаеться. Что не так

  5. Зачем сайт?
    Студия может сгенерировать это де что и сайт…
    вставка спецввставка класс из json

  6. Здравствуйте, а можно ли как-то подправлять вывод в JSON? Например, после сериализации у меня все поля класса выводятся в одной строке, можно сделать так, чтобы каждое было на своей?
    Или, например, заменять имя поля при сериализация на какое-то другое название и так же менять при десериализации?

    1. Здравствуйте. После десериализации есть полная модель экземпляра класса. Вы можете всё что угодно делать с ней.

      Выводите куда? В файл? Не забывайте тогда, что для вывода в каждую строку нужно использовать streamWriter.WriteLine.
      В richTextBox? В конце строки добавляйте символ ‘\n’, или Environment.NewLine.
      В консоли? Console.Write — для одной строки, Console.WriteLine для многих.
      В html? Не забывайте тогда тэг
      , который переносит строку.

      Дайте больше деталей для ответа 🙂

      Если вопрос про сам JSON — зачем его подправлять? Каждый перенос — это лишний символ, который будет увеличивать время передачи и увеличивать объем трафика.
      Если хотите посмотреть на качество полученного JSON — скопируйте его сюда: json.parser.online.fr — там будет много удобнее, поверьте 🙂

      1. Если конкретно, то надо получать запросы, обрабатывать и выводить на страницу браузера определенную информацию. Сейчас она выводится в виде:

        [{«endpoint»:»110″,»name»:»Server1″,»Matches»:[],»gameModes»:[«DM»,»TDM»],»top5GameModes»:[],»top5Maps»:[]}]

        Надо, чтобы было без , внешних квадратных скобок и каждое свойство на отдельной строке. Не подскажите, или как этого можно добиться или что можно почитать по этой теме.

        Вот этот мой вопрос: «Или, например, заменять имя поля при сериализация на какое-то другое название и так же менять при десериализации?» полностью решило [JsonProperty(«..»)].

        PS: Огромное спасибо Вам за полезную статью и быстрые ответы на вопросы.

        1. Надо, чтобы было без «»(оно в начале и в конце, без точек). Видимо, воспринимается, как специальный символ и убирается из окончательного вида комментария.

        2. Кажется я вас понял.
          Вы получаете данные от сервера в формате JSON и хотите их выводить на своем сайте. Данные, судя по всему, из какого-то сервера для мультиплеерного шутера, вроде CS 🙂

          Данные JSON, это сериализованные данные в формате, удобном для «общения» между программами. Чтобы вы могли четко восстановить структуру данных. Вы сейчас пытаетесь вывести эти данные самостоятельно на сайте без их десериализации. То есть написать свой собственный парсер JSON. В образовательных целях похвально, но практического смысла, увы, лишено.

          У вас сайт на какой CMS? Wordpess, drupal, joomla, bitrix? Самописка?
          На каком языке? PHP/C#?
          Можно реализовать десериализацию данных на JavaScript. (что JS, что PHP, что C# восхитительно работают с JSON).
          Поставьте задачу чуть конкретнее и я постараюсь вам помочь.

        3. Я посмотрел ваш JSON-объект. У него разные типы кавычек, из-за этого могли быть проблемы.
          Вот как должна выглядеть строка:
          [{«endpoint»:»110″,»name»:»Server1″,»Matches»:[],»gameModes»:[«DM»,»TDM»],»top5GameModes»:[],»top5Maps»:[]}]

          1. О, спасибо большое, думаю это должно помочь)

            Нет никакого сайта) Все выводится просто на голую страницу в формате JSON. Просто вид вывода немного не соответствовал требуемому.

    2. Здравствуйте уважаемая администрация. Я поражен вашим возможностям. Я бы очень хотел получить консультацию у такого профессионала как вы! Если есть такая возможность?P.S.Зеленый программист (в этой сфере).

    3. Здравствуйте, возможно ли как-то получить определенные данные при парсинге?
      Код парсит все данные

      Как мне обратится конкретно например к этим данным:

      1. Здравствуйте! Попробуйте вот так:

    4. Добрый день. Сервер мне отдает JSON вот в таком виде, мне же это надо вставить в переменные.
      Подскажите — как это к моему примеру применить?

      А получаю я этот JSON вот таким методом:

      1. Здравствуйте.
        В принципе- в статье достаточно информации для того, чтобы понять как с этим работать 🙂 Но всё же:
        1) С помощью сервиса json2csharp узнаем, что структура классов для работы с таким JSON’ом:

        2) Теперь нужно преобразовать сериализованные данные из JSON в объект, то есть произвести процесс десериализации:

        переменная json — это строка с вашим JSON объектом (то, что вы написали в комментарии);
        3) Вытащить нужные данные:

        Просто поставьте break point и в дебаге посмотрите содержимое объекта dataFromBackend

    5. Нужно взять captcha_img и captcha_sid

    6. Всё, как я писал выше:
      На сайте Json2CSharp получаем классы, добавляем в проект.

      Дальше код самого рабочего метода:

    7. Нужно сериализовать такой json с другими значениями

      1. Здравствуйте. Вот классы для вашего JSON.

        Дальше код для работы с этими классами:

    8. А под такой json какой класс будет?

      {«100-Proof Jug»:{«2017-05-08»:{«price»:11,»count»:0},»2017-06-08″:{«price»:9,»count»:0},»2017-06-11″:{«price»:6,»count»:0},»2017-06-18″:{«price»:7,»count»:0},»2017-06-30″:{«price»:9,»count»:0}},»2014 National Electronic Sports Tournament Ticket»:{«2017-05-15»:{«price»:13,»count»:0}},»A Bit of Boat»:{«2017-05-09»:{«price»:29,»count»:0},»2017-05-19″:{«price»:33,»count»:0},»2017-05-24″:{«price»:27,»count»:0},»2017-05-27″:{«price»:36,»count»:0},»2017-05-31″:{«price»:35,»count»:0},»2017-06-09″:{«price»:35,»count»:0},»2017-06-11″:{«price»:43,»count»:0},»2017-06-21″:

      1. Здравствуйте. Вам стоит обратиться к разработчикам ПО, которое выгружает такой JSON, так как на данный момент привести к классам C# это не получится, так как у вас структура:
        — название объекта
        [
        — дата
        — — цена
        — — количество,
        — дата
        — — цена
        — — количество
        ],
        — название объекта
        [
        — дата
        — — цена
        — — количество,
        — дата
        — — цена
        — — количество
        ]

        Тут отсутствуют классическая форма
        «Ключ: значение». Здесь ключ является уникальным, так как, по сути, является значением.

    9. Хех, большое спасибо. Уже более часа разбирался как же это работает, хотя собсно я по сути только что начал изучать C# с этого =) (да, я псих)

      Пишу это что бы поблагодарить автора, а еще подчеркнуть жуткую ложь:
      «Как видите — с JSON очень удобно работать. «, — вы сказали. После работы с PHP, JavaScript и подобными я просто чуть мозг не сломал пока понял как это тут работает 🙂 Вся эта работа с обьектами для меня пока идет сложно, так что разбираюсь. А вам я бы мог лишь предложить создать целый туториал по C#. Конечно, в сети уже полно разных, а вы уйдите в подробности, дайте больше данных, ссылки на полезные ресурсы, лайфхаки как уже опытного разработчика, было бы полезно для народа.

      1. Спасибо за Ваш отзыв!
        Я понимаю что Вам понравилось при работе с JSON в PHP и JS — отсуствие знания о том, что находится в объекте.
        Вы просто в одну строчку получаете объект со всеми данными и дальше выводите из него нужную Вам информацию. Удобно — да. Практично — нет.
        C# это строготипизированный язык, вы четко знаете с чем и как вы работаете. Это дает гарантию того, что Ваше приложение будет работать верно.
        Для этого нужно знать структуру данных, которую Вы получите, чтобы верно произвести mapping данных.
        А вообще — можно работать с JSON также, как и в PHP и JS — посмотрите вот эту ссылку:
        Deserialize JSON into C# dynamic object?

        У c# есть тоже свой «нетипизированный» тип объектов. Dynamic
        О нём нужно знать, но пользоваться — спорный вопрос. Его использование должно иметь серьезное основание. Я за свой опыт работы не сталкивался с такими ситуациями, чтобы dynamic был единственным решением проблемы.

        Основы C# это здорово, но есть шикарнейший сайт — metanit.com
        Там есть очень много информации и по C# (с нуля) и по ASP.NET, паттернам проектирования и многому другому. Я бы Вам рекомендовал начать своё самообразование именно с этого сайта. Я сам многое изучал с него и дополнял свои «пробелы» в знаниях на нём. Очень рекомендую + хочу отдельно поблагодарить автора сайта метанит (если он вдруг когда-нибудь сюда зайдет :)) за замечательный сайт.

    10. Здравствуйте, нам тут в техникуме проект задали написать бота для телеграмм, который будет более-менее адекватно реагировать и отвечать на смс. На сколько я понял Json.parse мне должен в этом помочь (если нет, подскажите мб что). Но я никак не могу понять каким образом бот должен воспринимать смс пользователя?
      Помогите пожалуйста

      1. Здравствуйте.
        К сожалению с телеграмм-ботами я раньше не работал.
        К тому же интересно как вы будете выполнять данное задание, учитывая блокировку телеграмма на территории РФ.

        Всё же давайте постараюсь помочь.
        Дайте, пожалуйста, немного больше информации о ТЗ.

        На данной странице находится информация об АПИ для ботов:
        https://core.telegram.org/bots/api
        https://core.telegram.org/bots/faq
        Вот ссылка на пример бота, написанный на PHP — https://core.telegram.org/bots/samples/hellobot
        PHP достаточно легко читаемый язык, чтобы понять базовую концепцию.

        Вот хороший nuget-пакет для работы с телеграмм для C#.
        Если что — спрашивайте.

    11. Доброго времени!

      есть Api

      хотелось бы вытащить данные из XVG estimate

      Зарание благодарен

      },
      «XMN»: {
      «algo»: «x16r»,
      «port»: 3637,
      «name»: «Motion»,
      «height»: 103592,
      «workers»: 0,
      «shares»: 7,
      «hashrate»: 0,
      «estimate»: «0.00000»,
      «24h_blocks»: 0,
      «24h_btc»: 0,
      «lastblock»: 83267,
      «timesincelast»: 2437208
      },
      «XSH»: {
      «algo»: «blake2s»,
      «port»: 5771,
      «name»: «SHIELD»,
      «height»: 962133,
      «workers»: 2,
      «shares»: 349541,
      «hashrate»: 1381956251076,
      «estimate»: «0.00459»,
      «24h_blocks»: 0,
      «24h_btc»: 0,
      «lastblock»: 954094,
      «timesincelast»: 338060
      },
      «XVG»: {
      «algo»: «blake2s»,
      «port»: 5770,
      «name»: «Verge»,
      «height»: 2531491,
      «workers»: 15291,
      «shares»: 612682,
      «hashrate»: 89051326481712,
      «estimate»: «0.00660»,
      «24h_blocks»: 156,
      «24h_btc»: 0.24369029,
      «lastblock»: 2531448,
      «timesincelast»: 1629

      1. Здравствуйте, это лишь часть JSON-файла, который вы хотите распарсить.
        Но исходя из поставленной задачи ваш класс будет выглядеть следующим образом:
        public class XVG
        {
        public string algo { get; set; }
        public int port { get; set; }
        public string name { get; set; }
        public int height { get; set; }
        public int workers { get; set; }
        public int shares { get; set; }
        public long hashrate { get; set; }
        public string estimate { get; set; }
        public int __invalid_name__24h_blocks { get; set; }
        public double __invalid_name__24h_btc { get; set; }
        public int lastblock { get; set; }
        public int timesincelast { get; set; }
        }

        public class RootObject
        {
        public XVG XVG { get; set; }
        }

    12. Добрый день!) Подскажите, пожалуйста, как можно вывести каждое значение idusers? И как обращаться к каждому?)
      Json вот такой: http://tools.aimylogic.com/api/googlesheet2json?sheet=1&id=148hhI5_zyIepsjb1FSQQ2oaJeXnKrPXAWVMGKf1H6so

      Очень полезная статья, спасибо! Но вроде все сделал как описано, но мне выдает ошибку: Cannot deserialize the current JSON array (e.g. [1,2,3]) into type ‘MonteceVkBot.Program+MyMusic’ because the type requires a JSON object (e.g. {«name»:»value»}) to deserialize correctly.

      To fix this error either change the JSON to a JSON object (e.g. {«name»:»value»}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array.

      1. Здравствуйте. Вот класс для вашего JSON.

        Обратите внимание на ваш JSON-файл. Он начинается на ‘[‘ и заканчивается на ‘]’. А не как обычно на ‘{‘ и ‘}’. Фигурные скобки указывают, что данный текст — сериализованный объект, а квадратные — сериализованный массив объектов.
        Сериализатору (Newtonsoft.Json) не всё равно, что он сериализует — объект, или массив объектов. Ему нужно на это указать.

        Вы делали, скорее всего, так:

        Попробуйте сделать вот так:

        В итоге — будет переменная типа IList, которую можно будет итерировать через foreach:

    13. Здравствуйте. Возникла проблема, такая же как и Вячеслава. Не могу подружиться с Deserialize. Это возможно из-за наличия скобок [] в Youtube API. ( https://www.googleapis.com/youtube/v3/videos?part=statistics&id=DP2dAucXUSs&key=AIzaSyDl5aJiVId0gOjlVNn09qDI7Z4oSAPLPmU )

      1. Попробуйте строку
        > var data = JsonConvert.DeserializeObject (jsonString);
        Заменить на строку
        > var data = JsonConvert.DeserializeObject (jsonString);

        Плюс — вынести класс Program из класса RootObject

      1. Прошу прощения — сайт модерирую и веду я один. А спама слишком много, поэтому все комментарии проходят ручную модерацию.

    14. Может кому пригодится. Это получение данных при помощи JSON с API Youtube

      1. Вы уже сами решили свою проблему, я просто оставлю несколько комментариев, которые, надеюсь, вам помогут 🙂

        1. Старайтесь делать так, чтобы название классов соответствовало тому, что он делает.То есть «RootObject» я бы заменил на «YoutubeVideosStatisticResponseObject», а «basis» на «YoutubeVideosStatisticConsoleApplication». Да, длинновато, зато даже без изучения кода становится понятно что за класс и зачем он нужен;
        2. Вспомогательные классы стоит вынести в отдельную папку и неймспейс, чтобы эти классы-контракты не мешались с Вашим кодом, например папка «YoutubeJsonContracts» вполне сойдет;
        3. Многие методы «кидают ошибки», и их лучше перехватывать и обрабатывать нужным Вам способом. Например WebClient.DownloadString может выдать аж 3 ошибки при работе, а именно:
        — ArgumentNullException (если придет null, вместо адреса);
        — WebException (если сервер по указанному адресу ответит ошибкой (404/500..));
        — NotSupportedException (связано с мультипоточностью).
        Так как WebClient — системный класс, то вы можете найти всю подробную информацию об ошибках на оф сайте:
        https://docs.microsoft.com/en-us/dotnet/api/system.net.webclient.downloadstring?view=netframework-4.7.2
        Эти ошибки можно перехватывать и выдавать соответствующие ошибки пользователю, вместо того, чтобы давать программе «вылетать»;
        4. Старайтесь делать методы как можно более простыми. Один метод — одна задача. Получить содержимое ссылки по адресу — один метод, вывод информации из полученного объекта по ссылке — другой метод и так далее.. Метод Main может выглядеть следующим образом:
        var jsonString = MyWebService.DownloadString(«someUrl»);
        var youtubeVideosStatisticResponse = JsonConvert.DeserializeObject(jsonString);
        MyDebugService.PrintYoutubeStatisticData(youtubeVideosStatisticResponse);

        1. Спасибо за советы) Это практически первый проект на c#.Каюсь. Названия давал рандомные, так как долго не мог отладить ошибку. Сейчас все преобразовываю в оболочку. Уже столкнулся с проблемой неверного GET запроса и вылетом программы, пока решаю костылями.
          Проект для собственного пользования. Как он будет готов и будет сформирована логика, то постараюсь переписать более грамотно и с наименьшим набором костылей.

          У вас отличный сайт! Спасибо. До этого я потратил много времени на просмотры темы в ютубе, перерыл кучу сайтов. Изначально реализовывал на ардуино. (точнее ESP8266) Но там скорость парсинга JSON была не менее 20 секунд. После решил перейти на мощности ПК. Но так, как нет опыта в этом, то решил взяться за Proccesing. Но документации по нему мало. Вот, вроде, проект продвигается. Вы еще есть где-нибудь, помимо сайта? Не против, если отблагодарю ваш сайт в видеоролике?

    15. Здравствуйте. Помогите пожалуйтста с такой задачей.
      Имеются сгенерированные классы

      Есть снипет:

      Который загружает данные в таблицу.
      А как получить данные конкретного поля из списка

      1. Здравствуйте.
        Хотелось бы увидеть сам JSON, а так в целом комментарии:

        1. Измените классы:

        2. Когда вы десериализуете объект — стоит указывать то, к чему вы его десериализуете:

        Тогда для итерации rubrics вам нужно будет:

    16. Спасибо большое за Ваш ответ. Немного странно, что мой код так странно отображается. Не хватает некоторых элементов. Ну да ладно, направление понял, буду дальше разбираться.

    17. Большое спасибо за сайт и, конкретно, за эту статью.
      Не понимаю как за два года это не разу не всплыло, но наверно нужно сделать два уточнения, а то я пару часов убил пытаясь понять где у меня была ошибка.

      Во первых, все поля сериализируемого класса должны быть public или что-то подобное. Иначе сериализатор их просто не увидит. Не выдаст ошибку а просто не увидит и не запишет.

      Во вторых, если в классе есть какой-нибудь конструктор то в этот нужно добавить ещё и пустой конструктор. Иначе десериализатор выдаст ошибку «ссылка на объект не указывает на экземпляр объекта»

      1. Большое спасибо за приятный отзыв 🙂

        Да, такие нюансы есть. Я их добавлю в статью.
        Статья добавлялась скорее для знакомства начинающего C#-разработчика с миром сериализации, поэтому сильно в детали я не углублялся. Однако вы указали действительно важные вещи даже для начинающих.
        Спасибо!

    18. Такой вопрос: у меня сериализируется всегда только последнее сообщение. То есть нет истории сообщений по сути. Может есть решение проблемы?

      1. Добрый день! Сериализация-десерализация это лишь процесс преобразования данных из одного формата в другой (бинарный (объекты в C#) в тектстовый (JSON)). Я могу постараться вам помочь, но нужно больше данных о том — откуда вы берете JSON, пример этого JSON, как вы его преобразуете и класс C# (модель этого объекта).

    19. Огромное Вам спасибо за понятное объяснение!!! Наконец-то разобралась! Ура!

      1. Большое спасибо за отзыв! Если у вас остались какие-то вопросы — спрашивайте — постараюсь помочь.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *