Udostępnij za pośrednictwem


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

  1. 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.

  1. Utwórz wystąpienie Person typu.

    var p = new Person();
    p.name = "John";
    p.age = 42;
    
  2. Serializuj Person obiekt do strumienia pamięci przy użyciu .DataContractJsonSerializer

    var stream1 = new MemoryStream();
    var ser = new DataContractJsonSerializer(typeof(Person));
    
  3. WriteObject Użyj metody , aby zapisać dane JSON w strumieniu.

    ser.WriteObject(stream1, p);
    
  4. 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

  1. Deserializowanie danych zakodowanych w formacie JSON w nowym wystąpieniu PersonDataContractJsonSerializerprzy użyciu ReadObject metody .

    stream1.Position = 0;
    var p2 = (Person)ser.ReadObject(stream1);
    
  2. 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;
}

Zobacz też