Сериализация в JSON
Существует два основных способа преобразования (сериализации) объектов .NET в JSON:
- Использование класса DataContractJsonSerializer;
- Использование класса jаvascriptSerializer.
Использование класса 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. Обобщённый метод. Десериализует строку в формате JSON в заданный .NET объект;
- DeserializeObject. Десериализует строку в формате JSON в словарь в формате Dictionary .
Пример использования метода 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.