DataContractJsonSerializer'ı kullanma

Not

Bu makale hakkındadır DataContractJsonSerializer. JSON seri hale getirme ve seri durumdan çıkarma içeren çoğu senaryo için System.Text.Json ad alanında API'leri öneririz.

JSON (JavaScript Nesne Gösterimi), istemci tarayıcıları ile AJAX özellikli Web hizmetleri arasında az miktarda verinin hızlı değişimini sağlayan verimli bir veri kodlama biçimidir.

Bu makalede, .NET türü nesnelerini JSON ile kodlanmış veriler halinde seri hale getirme ve ardından JSON biçimindeki verilerin seri durumdan çıkarılarak .NET türleri örneklerine geri döndürülmesi gösterilmektedir. Bu örnekte, kullanıcı tanımlı Person bir türün seri hale getirilmesini ve seri durumdan çıkarılma durumunu göstermek için bir veri sözleşmesi kullanılır ve kullanır DataContractJsonSerializer.

Normalde JSON serileştirme ve seri durumdan çıkarma, AJAX özellikli uç noktalar üzerinden kullanıma sunulan hizmet işlemlerinde veri sözleşmesi türlerini kullandığınızda Windows Communication Foundation (WCF) tarafından otomatik olarak işlenir. Ancak bazı durumlarda doğrudan JSON verileriyle çalışmanız gerekebilir.

Bu makale DataContractJsonSerializer örneğini temel alır.

Kişi türü için veri sözleşmesini tanımlamak için

  1. sınıfına ve DataMemberAttribute özniteliğini DataContractAttribute serileştirmek istediğiniz üyelere ekleyerek için Person veri sözleşmesini tanımlayın. Veri sözleşmeleri hakkında daha fazla bilgi için bkz . Hizmet sözleşmeleri tasarlama.

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

Person to JSON türünde bir örneği seri hale getirmek için

Not

Sunucuda giden yanıtın seri hale getirilmesi sırasında veya başka bir nedenle bir hata oluşursa, istemciye hata olarak döndürülmeyebilir.

  1. Türün bir örneğini Person oluşturun.

    var p = new Person();
    p.name = "John";
    p.age = 42;
    
  2. kullanarak nesnesini bir bellek akışına seri hale Person getirin DataContractJsonSerializer.

    var stream1 = new MemoryStream();
    var ser = new DataContractJsonSerializer(typeof(Person));
    
  3. WriteObject JSON verilerini akışa yazmak için yöntemini kullanın.

    ser.WriteObject(stream1, p);
    
  4. JSON çıkışını gösterin.

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

JSON'dan Person türünün bir örneğini seri durumdan çıkarmak için

  1. yöntemini kullanarak JSON ile kodlanmış verilerin seri durumdan ReadObject çıkarılarak yeni bir örneğine Person seri durumdan çıkarılırDataContractJsonSerializer.

    stream1.Position = 0;
    var p2 = (Person)ser.ReadObject(stream1);
    
  2. Sonuçları gösterin.

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

Örnek

// 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;
}

Not

JSON seri hale getiricisi, aşağıdaki örnek kodda gösterildiği gibi aynı ada sahip birden çok üyeye sahip veri sözleşmeleri için bir serileştirme özel durumu oluşturur.

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

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

Ayrıca bkz.