При работе с веб-сервисами, периодически возникает задача создавать классы для десериализации данных, полученных в формате json или xml. Зачастую, ввиду большого числа полей и глубины вложенности данных, это достаточно утомительное занятие. Упростить и ускорить его поможет Visual Studio 2013.
В первую очередь потребуются сами данные в формате json/xml. Получить их можно разными способами:
- сделать запрос к серверу из браузера, в некоторых случаях этого будет достаточно;
- воспользоваться плагинами для браузера, предоставляющими такие дополнительные возможности, как отправку POST, авторизацию и т.д. (например Postman для Chrome);
- написать код получения ответа в создаваемом приложении (ведь он все равно потребуется). Поставить точку останова и в отладке скопировать данные из переменной, содержащей ответ в виде текста.
- воспользоваться сервисами генерации json по шаблону (например: 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);