Быстрое создание C# классов на базе json или xml

При работе с веб-сервисами, периодически возникает задача создавать классы для десериализации данных, полученных в формате json или xml. Зачастую, ввиду большого числа полей и глубины вложенности данных, это достаточно утомительное занятие. Упростить и ускорить его поможет Visual Studio 2013.

В первую очередь потребуются сами данные в формате json/xml. Получить их можно разными способами:

  • сделать запрос к серверу из браузера, в некоторых случаях этого будет достаточно;
  • воспользоваться плагинами для браузера, предоставляющими такие дополнительные возможности, как отправку POST, авторизацию и т.д. (например Postman для Chrome);
  • написать код получения ответа в создаваемом приложении (ведь он все равно потребуется). Поставить точку останова и в отладке скопировать данные из переменной, содержащей ответ в виде текста.
  • воспользоваться сервисами генерации json по шаблону (например: http://json-generator.com\)

Полученный ответ необходимо скопировать в буфер обмена.

Теперь создадим пустой C# файл. В нем не должно быть ничего, кроме указания namespace. Курсор поставим внутрь namespace, куда будет вставлен код созданных классов.

namespace MyProject.Namespace
{

}

Последний шаг – запускаем генерацию. Для этого в меню Visual Studio выбираем EDIT > Paste Special > Paste JSON as Classes.

В результате будут созданы необходимые C# классы. Например:

namespace MyProject.Namespace
{
    public class Rootobject
    {
        public Class1[] Property1 { get; set; }
    }

    public class Class1
    {
        public int id{ get; set; }
        public Name name { get; set; }
        public Friend[] friends { get; set; }
    }

    public class Name
    {
        public string first { get; set; }
        public string last { get; set; }
    }

    public class Friend
    {
        public int id { get; set; }
        public string name { get; set; }
    }
}

Корневой класс будет называться Rootobject. Имена остальных, где это возможно будут выведены из названий полей.

Можно провести небольшой рефакторинг, например дав Rootobject и Class1 более осмысленные названия и разместив каждый класс в отдельном файле. Но даже без этого полученный код уже можно использовать для десериализации json.

Rootobject data = JsonConvert.DeserializeObject<Rootobject>(textResponse);