Главная / C# статьи > Работаем с JSON в C#. Сериализация и десериализация

Работаем с JSON в C#. Сериализация и десериализация

На сегодняшний день JSON входит в число основных форматов представления сложных структур и обмена данными. Поэтому все основные языки программирования имеют встроенную поддержку для работы с ним. C# не исключение.

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


Существует два основных способа преобразования (сериализации) объектов .NET в JSON:

Использование класса DataContractJsonSerializer


Класс DataContractJsonSerializer сериализует объекты .NET в поток (Stream) в виде текста в формате JSON или XML сопоставимый с JSON.

Для того чтобы сериализация объекта стала возможна он должен быть отмечен атрибутом DataContract, а его члены подлежащие сериализации атрибутом DataMember. Чтобы эти атрибуты и сам класс DataContractJsonSerializer стали доступны, необходимо подключить к проекту сборку System.Runtime.Serialize.

{reklama}

В качестве примера создадим класс, который описывает организацию.

class Company
{
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public string INN { get; set; }
    [DataMember]
    public string Adress { get; set; }
}


Создадим объект класса DataContractJsonSerializer для сериализации объектов класса Company.

DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Company));



Обратите внимание. Сериализуемый тип передаётся в качестве параметра конструктора.

Далее необходимо создать поток для сериализованных данных.

MemoryStream stream = new MemoryStream();


Или XmlWriter для XML сопоставимого с JSON. Например:

XmlWriter writer = new XmlTextWriter("test.xml", null);


Сам процесс сериализации осуществляется с помощью метода WriteObject класса DataContractJsonSerializer. В качестве первого параметра ему передаётся либо поток, либо объект XmlWriter. В качестве второго параметра сериализуемый объект.

В итоге получается или поток с текстом в формате JSON.

serializer.WriteObject(stream, company);


Или XML сопоставимый с JSON.

serializer.WriteObject(writer, company);
writer.Close();


Использование класса jаvascriptSerializer


Класс jаvascriptSerializer расположен в пространстве имён System.Web.Script.Serialization (требует подключения сборки System.Web.Extensions).

Его отличительная особенность в том, что он сериализует объекты в JSON возвращая обычную строку (string) с текстом в формате JSON. При этом совершенно не требуется обозначать сериализуемый объект или его члены специальными атрибутами.

Конструктор класса jаvascriptSerializer не требует передачи каких либо параметров, а для выполнения сериализации объект передаётся в качестве единственного параметра методу Serialize.

javascriptSerializer serializer = new javascriptSerializer();
string json = serializer.Serialize(company);



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


Данные сериализованные в JSON можно получить обратно.

Использование класса DataContractJsonSerializer


Десериализация производится при помощи метода ReadObject. В качестве единственного параметра ему передаётся поток с текстом в формате JSON или объект XmlReader для чтения XML сопоставимого с JSON.

При десериализации из потока необходимо установить указатель на позицию соответствующую началу данных в формате JSON (в простейшем случае это 0).

stream.Position = 0;
Company company = (Company)serializer.ReadObject(stream);


Если требуется десериализовать данные их XML сопоставимого с JSON, создаём XmlReader для этого XML (в данном примере XML хранится в файле) и передаём его в метод ReadObject класса DataContractJsonSerializer.

XmlReader reader = new XmlTextReader("test.xml");
Company company = (Company)serializer.ReadObject(reader);


Использование класса jаvascriptSerializer


Для десериализации у класса jаvascriptSerializer есть два метода:


Пример использования метода Deserialize:

Company company = serializer.Deserialize<Company>(json);


Пример использования метода DeserializeObject:

Dictionary<string,object> company = (Dictionary < string,object>) serializer.DeserializeObject(json);


Метод Deserialize выполняет простую десериализацию, восстанавливая из JSON исходный объект. Метод DeserializeObject возвращает коллекцию, структура которой соответствует структуре исходного JSON. Что даёт возможность работать с JSON как с обычной коллекцией C# извлекая из неё для последующей обработки лишь необходимые данные.

string Adress = company["Adress"].ToString();


Таким образом, в зависимости от требований задачи, можно выбрать наиболее подходящее средство для работы с JSON.
1-04-2017, 20:23. Разместил: administrator
Вернуться назад