Как сериализовать и десериализовать данные JSON
JSON — эффективный формат кодирования данных, обеспечивающий быстрый обмен небольшими объемами данных между клиентскими браузерами и веб-службами с поддержкой AJAX.
В этом разделе показано, как сериализовать объекты типов .NET в данные с кодировкой JSON, а затем десериализовать формат JSON обратно в экземпляры типов .NET с помощью сериализатора DataContractJsonSerializer. В этом примере показана сериализация и десериализация пользовательского типа Person
с помощью контракта данных.
Обычно сериализация и десериализация JSON обрабатывается автоматически в Windows Communication Foundation (WCF) при использовании типов контрактов данных в операциях службы, предоставляемых через конечные точки с поддержкой AJAX. Впрочем, в некоторых случаях может потребоваться работать с данными JSON напрямую. Именно этот сценарий рассмотрен в данном примере.
Примечание |
---|
Если возникает ошибка при сериализации исходящего ответа на сервере или операция ответа выдает исключение по какой-либо другой причине, такая ошибка может не вернуться на клиент в качестве сбоя. |
Этот раздел основан на примере Сериализация JSON.
Определение контракта для типа Person
Определите контракт данных для типа
Person
, применив атрибут DataContractAttribute к классу и атрибут DataMemberAttribute к элементам, которые требуется сериализовать. Дополнительные сведения контрактах данных см. в разделе Создание контрактов служб.[DataContract] internal class Person { [DataMember] internal string name; [DataMember] internal int age; }
Сериализация экземпляра типа Person в формат JSON
Создайте экземпляр типа
Person
.Person p = new Person(); p.name = "John"; p.age = 42;
Сериализуйте объект
Person
в поток памяти с помощью сериализатора DataContractJsonSerializer.MemoryStream stream1 = new MemoryStream(); DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Person));
С помощью метода WriteObject запишите данные JSON в поток.
ser.WriteObject(stream1, p);
Отобразите выходные данные JSON.
stream1.Position = 0; StreamReader sr = new StreamReader(stream1); Console.Write("JSON form of Person object: "); Console.WriteLine(sr.ReadToEnd());
Десериализация экземпляра типа Person из формата JSON
Десериализуйте данные в кодировке JSON в новый экземпляр типа
Person
с помощью метода ReadObject сериализатора DataContractJsonSerializer.stream1.Position = 0; Person p2 = (Person)ser.ReadObject(stream1);
Отобразите результаты.
Console.Write("Deserialized back, got name="); Console.Write(p2.name); Console.Write(", age="); Console.WriteLine(p2.age);
Пример
Примечание |
---|
Сериализатор JSON выдает исключение при сериализации контрактов данных, имеющих несколько элементов с одинаковым именем, как показано в следующем примере кода. |
[DataContract]
public class TestDuplicateDataBase
{
[DataMember]
public int field1 = 123;
}
[DataContract]
public class TestDuplicateDataDerived : TestDuplicateDataBase
{
[DataMember]
public new int field1 = 999;
}
См. также
Основные понятия
Изолированная сериализация JSON
Поддержка JSON и других форматов передачи данных