Поделиться через


Как сериализовать и десериализовать данные JSON

JSON — эффективный формат кодирования данных, обеспечивающий быстрый обмен небольшими объемами данных между клиентскими браузерами и веб-службами с поддержкой AJAX.

В этом разделе показано, как сериализовать объекты типов .NET в данные с кодировкой JSON, а затем десериализовать формат JSON обратно в экземпляры типов .NET с помощью сериализатора DataContractJsonSerializer. В этом примере показана сериализация и десериализация пользовательского типа Person с помощью контракта данных.

Обычно сериализация и десериализация JSON обрабатывается автоматически в Windows Communication Foundation (WCF) при использовании типов контрактов данных в операциях службы, предоставляемых через конечные точки с поддержкой AJAX. Впрочем, в некоторых случаях может потребоваться работать с данными JSON напрямую. Именно этот сценарий рассмотрен в данном примере.

Bb412179.note(ru-ru,VS.100).gifПримечание
Если возникает ошибка при сериализации исходящего ответа на сервере или операция ответа выдает исключение по какой-либо другой причине, такая ошибка может не вернуться на клиент в качестве сбоя.

Этот раздел основан на примере Сериализация JSON.

Определение контракта для типа Person

  1. Определите контракт данных для типа Person, применив атрибут DataContractAttribute к классу и атрибут DataMemberAttribute к элементам, которые требуется сериализовать. Дополнительные сведения контрактах данных см. в разделе Создание контрактов служб.

    [DataContract]
        internal class Person
        {
            [DataMember]
            internal string name;
    
            [DataMember]
            internal int age;
        }
    

Сериализация экземпляра типа Person в формат JSON

  1. Создайте экземпляр типа Person.

    Person p = new Person();
    p.name = "John";
    p.age = 42;
    
  2. Сериализуйте объект Person в поток памяти с помощью сериализатора DataContractJsonSerializer.

    MemoryStream stream1 = new MemoryStream();
    DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Person));
    
  3. С помощью метода WriteObject запишите данные JSON в поток.

    ser.WriteObject(stream1, p);
    
  4. Отобразите выходные данные JSON.

    stream1.Position = 0;
    StreamReader sr = new StreamReader(stream1);
    Console.Write("JSON form of Person object: ");
    Console.WriteLine(sr.ReadToEnd());
    

Десериализация экземпляра типа Person из формата JSON

  1. Десериализуйте данные в кодировке JSON в новый экземпляр типа Person с помощью метода ReadObject сериализатора DataContractJsonSerializer.

    stream1.Position = 0;
    Person p2 = (Person)ser.ReadObject(stream1);
    
  2. Отобразите результаты.

    Console.Write("Deserialized back, got name=");
    Console.Write(p2.name);
    Console.Write(", age=");
    Console.WriteLine(p2.age);
    

Пример

Bb412179.note(ru-ru,VS.100).gifПримечание
Сериализатор JSON выдает исключение при сериализации контрактов данных, имеющих несколько элементов с одинаковым именем, как показано в следующем примере кода.

[DataContract]
public class TestDuplicateDataBase
{
    [DataMember]
    public int field1 = 123;
}
[DataContract]
public class TestDuplicateDataDerived : TestDuplicateDataBase
{
    [DataMember]
    public new int field1 = 999;
}

См. также

Основные понятия

Изолированная сериализация JSON
Поддержка JSON и других форматов передачи данных