Sdílet prostřednictvím


Jak používat DataContractJsonSerializer

Poznámka:

Tento článek se týká DataContractJsonSerializer. Pro většinu scénářů, které zahrnují serializaci a deserializaci JSON, doporučujeme rozhraní API v oboru názvů System.Text.Json.

JSON (JavaScript Object Notation) je efektivní formát kódování dat, který umožňuje rychlé výměny malých objemů dat mezi klientskými prohlížeči a webovými službami s podporou AJAX.

Tento článek ukazuje, jak serializovat objekty typu .NET do dat kódovaných JSON a pak deserializovat data ve formátu JSON zpět do instancí typů .NET. Tento příklad používá kontrakt dat k předvedení serializace a deserializace uživatelem definovaného Person typu a používá DataContractJsonSerializer.

Za normálních okolností se serializace a deserializace JSON zpracovává automaticky službou Windows Communication Foundation (WCF) při použití typů kontraktů dat v operacích služby, které jsou vystaveny přes koncové body s podporou AJAX. V některých případech ale možná budete muset pracovat s daty JSON přímo.

Tento článek je založen na ukázce DataContractJsonSerializer.

Definování datového kontraktu pro typ Osoby

  1. Definujte kontrakt Person dat tak, že připojíte DataContractAttribute třídu a DataMemberAttribute atribut k členům, které chcete serializovat. Další informace o kontraktech dat najdete v tématu Návrh kontraktů služeb.

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

Serializace instance typu Person to JSON

Poznámka:

Pokud během serializace odchozí odpovědi na serveru nebo z nějakého jiného důvodu dojde k chybě, nemusí se klientovi vrátit jako chyba.

  1. Vytvořte instanci Person typu.

    var p = new Person();
    p.name = "John";
    p.age = 42;
    
  2. Serializace objektu Person do datového proudu paměti pomocí DataContractJsonSerializer.

    var stream1 = new MemoryStream();
    var ser = new DataContractJsonSerializer(typeof(Person));
    
  3. Metoda slouží k zápisu WriteObject dat JSON do datového proudu.

    ser.WriteObject(stream1, p);
    
  4. Zobrazení výstupu JSON

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

Deserializace instance typu Person z JSON

  1. Deserializace dat kódovaných json do nové instance Person pomocí ReadObject metody DataContractJsonSerializer.

    stream1.Position = 0;
    var p2 = (Person)ser.ReadObject(stream1);
    
  2. Zobrazí výsledky.

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

Příklad

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

Poznámka:

Serializátor JSON vyvolá výjimku serializace pro kontrakty dat, které mají více členů se stejným názvem, jak je znázorněno v následujícím vzorovém kódu.

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

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

Viz také