Как использовать DataContractJsonSerializerHow to: use DataContractJsonSerializer

JSON - эффективный формат кодирования данных, обеспечивающий быстрый обмен небольшими объемами данных между клиентскими браузерами и веб-службами с поддержкой AJAX.JSON (JavaScript Object Notation) is an efficient data encoding format that enables fast exchanges of small amounts of data between client browsers and AJAX-enabled Web services.

В этой статье показано, как сериализовать объекты типа .NET в данные в кодировке JSON, а затем десериализовать данные в формате JSON обратно в экземпляры типов .NET.This article demonstrates how to serialize .NET type objects into JSON-encoded data and then deserialize data in the JSON format back into instances of .NET types. В этом примере используется контракт данных для демонстрации сериализации и десериализации определяемого пользователем типа Person и используется DataContractJsonSerializer.This example uses a data contract to demonstrate serialization and deserialization of a user-defined Person type and uses DataContractJsonSerializer.

Как правило, сериализация и десериализация JSON автоматически обрабатываются Windows Communication Foundation (WCF) при использовании типов контрактов данных в операциях службы, которые доступны через конечные точки с поддержкой AJAX.Normally, JSON serialization and deserialization are handled automatically by Windows Communication Foundation (WCF) when you use data contract types in service operations that are exposed over AJAX-enabled endpoints. Однако в некоторых случаях может потребоваться непосредственная работа с данными JSON.However, in some cases you may need to work with JSON data directly.

Примечание

Эта статья посвящена DataContractJsonSerializer.This article is about DataContractJsonSerializer. В большинстве сценариев, в которых участвует сериализация и десериализация JSON, рекомендуется использовать средства из пространства имен System. Text. JSON.For most scenarios that involve serializing and deserializing JSON, we recommend the tools in the System.Text.Json namespace.

Эта статья основана на образце DataContractJsonSerializer.This article is based on the DataContractJsonSerializer sample.

Определение контракта данных для типа PersonTo define the data contract for a Person type

  1. Определите контракт данных для типа Person, применив атрибут DataContractAttribute к классу и атрибут DataMemberAttribute к элементам, которые требуется сериализовать.Define the data contract for Person by attaching the DataContractAttribute to the class and DataMemberAttribute attribute to the members you want to serialize. Дополнительные сведения о контрактах данных см. в разделе проектирование контрактов служб.For more information about data contracts, see Designing service contracts.

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

Сериализация экземпляра типа Person в формат JSONTo serialize an instance of type Person to JSON

Примечание

Если ошибка возникает во время сериализации исходящего ответа на сервере или по какой-либо другой причине, она может не возвращаться клиенту в качестве ошибки.If an error occurs during serialization of an outgoing reply on the server or for some other reason, it may not get returned to the client as a fault.

  1. Создайте экземпляр типа Person.Create an instance of the Person type.

    var p = new Person();  
    p.name = "John";  
    p.age = 42;  
    
  2. Сериализует объект Person в поток памяти с помощью DataContractJsonSerializer.Serialize the Person object to a memory stream by using the DataContractJsonSerializer.

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

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

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

Десериализация экземпляра типа Person из формата JSONTo deserialize an instance of type Person from JSON

  1. Десериализуйте данные в кодировке JSON в новый экземпляр типа Person с помощью метода ReadObject сериализатора DataContractJsonSerializer.Deserialize the JSON-encoded data into a new instance of Person by using the ReadObject method of the DataContractJsonSerializer.

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

    Console.WriteLine($"Deserialized back, got name={p2.name}, age={p2.age}");  
    

ПримерExample

// Create a User object and serialize it to a JSON stream.  
public static string WriteFromObject()  
{  
    // Create User object.  
    var user = new User("Bob", 42);  
  
    // Create a stream to serialize the object to.  
    var ms = new MemoryStream();  
  
    // Serializer the User object to the stream.  
    var ser = new DataContractJsonSerializer(typeof(User));  
    ser.WriteObject(ms, user);  
    byte[] json = ms.ToArray();  
    ms.Close();  
    return Encoding.UTF8.GetString(json, 0, json.Length);  
}  
  
// Deserialize a JSON stream to a User object.  
public static User ReadToObject(string json)  
{  
    var deserializedUser = new User();  
    var ms = new MemoryStream(Encoding.UTF8.GetBytes(json));  
    var ser = new DataContractJsonSerializer(deserializedUser.GetType());  
    deserializedUser = ser.ReadObject(ms) as User;  
    ms.Close();  
    return deserializedUser;  
}  

Примечание

Сериализатор JSON выдает исключение при сериализации контрактов данных, имеющих несколько элементов с одинаковым именем, как показано в следующем примере кода.The JSON serializer throws a serialization exception for data contracts that have multiple members with the same name, as shown in the following sample code.

[DataContract]  
public class TestDuplicateDataBase  
{  
    [DataMember]  
    public int field1 = 123;  
}

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

См. такжеSee also