Jak używać elementu DataContractJsonSerializer
Uwaga
Ten artykuł dotyczy DataContractJsonSerializerusługi . W przypadku większości scenariuszy obejmujących serializowanie i deserializacji danych JSON zalecamy interfejsy API w przestrzeni nazw System.Text.Json.
JSON (JavaScript Object Notation) to wydajny format kodowania danych, który umożliwia szybką wymianę małych ilości danych między przeglądarkami klienta i usługami sieci Web obsługującymi AJAX.
W tym artykule pokazano, jak serializować obiekty typu .NET w danych zakodowanych w formacie JSON, a następnie deserializować dane w formacie JSON z powrotem do wystąpień typów platformy .NET. W tym przykładzie użyto kontraktu danych, aby zademonstrować serializacji i deserializacji typu zdefiniowanego przez Person
użytkownika i używa metody DataContractJsonSerializer.
Zwykle serializacja i deserializacji JSON są obsługiwane automatycznie przez program Windows Communication Foundation (WCF) podczas korzystania z typów kontraktów danych w operacjach usługi, które są uwidocznione w punktach końcowych z obsługą AJAX. Jednak w niektórych przypadkach może być konieczne bezpośrednie współdziałanie z danymi JSON.
Ten artykuł jest oparty na przykładzie DataContractJsonSerializer.
Aby zdefiniować kontrakt danych dla typu osoba
Zdefiniuj kontrakt danych dla elementu
Person
, dołączając DataContractAttribute element do klasy i DataMemberAttribute atrybutu do składowych, dla których chcesz serializować. Aby uzyskać więcej informacji na temat kontraktów danych, zobacz Projektowanie kontraktów usług.[DataContract] internal class Person { [DataMember] internal string name; [DataMember] internal int age; }
Aby serializować wystąpienie typu Person do formatu JSON
Uwaga
Jeśli podczas serializacji odpowiedzi wychodzącej na serwerze wystąpi błąd lub z jakiegoś innego powodu, może nie zostać zwrócony klientowi jako błąd.
Utwórz wystąpienie
Person
typu.var p = new Person(); p.name = "John"; p.age = 42;
Serializuj
Person
obiekt do strumienia pamięci przy użyciu .DataContractJsonSerializervar stream1 = new MemoryStream(); var ser = new DataContractJsonSerializer(typeof(Person));
WriteObject Użyj metody , aby zapisać dane JSON w strumieniu.
ser.WriteObject(stream1, p);
Pokaż dane wyjściowe JSON.
stream1.Position = 0; var sr = new StreamReader(stream1); Console.Write("JSON form of Person object: "); Console.WriteLine(sr.ReadToEnd());
Aby wykonać deserializowanie wystąpienia typu Person z formatu JSON
Deserializowanie danych zakodowanych w formacie JSON w nowym wystąpieniu
Person
DataContractJsonSerializerprzy użyciu ReadObject metody .stream1.Position = 0; var p2 = (Person)ser.ReadObject(stream1);
Pokaż wyniki.
Console.WriteLine($"Deserialized back, got name={p2.name}, age={p2.age}");
Przykład
// 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;
}
Uwaga
Serializator JSON zgłasza wyjątek serializacji dla kontraktów danych, które mają wiele elementów członkowskich o tej samej nazwie, jak pokazano w poniższym przykładowym kodzie.
[DataContract]
public class TestDuplicateDataBase
{
[DataMember]
public int field1 = 123;
}
[DataContract]
public class TestDuplicateDataDerived : TestDuplicateDataBase
{
[DataMember]
public new int field1 = 999;
}