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
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.
Vytvořte instanci
Person
typu.var p = new Person(); p.name = "John"; p.age = 42;
Serializace objektu
Person
do datového proudu paměti pomocí DataContractJsonSerializer.var stream1 = new MemoryStream(); var ser = new DataContractJsonSerializer(typeof(Person));
Metoda slouží k zápisu WriteObject dat JSON do datového proudu.
ser.WriteObject(stream1, p);
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
Deserializace dat kódovaných json do nové instance
Person
pomocí ReadObject metody DataContractJsonSerializer.stream1.Position = 0; var p2 = (Person)ser.ReadObject(stream1);
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;
}