Dela via


Använda DataContractJsonSerializer

Kommentar

Den här artikeln handlar om DataContractJsonSerializer. För de flesta scenarier som omfattar serialisering och deserialisering av JSON rekommenderar vi API:erna i namnområdet System.Text.Json.

JSON (JavaScript Object Notation) är ett effektivt datakodningsformat som möjliggör snabba utbyten av små mängder data mellan klientwebbläsare och AJAX-aktiverade webbtjänster.

Den här artikeln visar hur du serialiserar .NET-typobjekt till JSON-kodade data och sedan deserialiserar data i JSON-format tillbaka till instanser av .NET-typer. I det här exemplet används ett datakontrakt för att demonstrera serialisering och deserialisering av en användardefinierad Person typ och använder DataContractJsonSerializer.

Normalt hanteras JSON-serialisering och deserialisering automatiskt av Windows Communication Foundation (WCF) när du använder datakontraktstyper i tjänståtgärder som exponeras via AJAX-aktiverade slutpunkter. I vissa fall kan du dock behöva arbeta direkt med JSON-data.

Den här artikeln baseras på exemplet DataContractJsonSerializer.

Så här definierar du datakontraktet för en persontyp

  1. Definiera datakontraktet för Person genom att koppla DataContractAttribute till klassen och DataMemberAttribute attributet till de medlemmar som du vill serialisera. Mer information om datakontrakt finns i Designa tjänstkontrakt.

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

Serialisera en instans av typen Person till JSON

Kommentar

Om ett fel uppstår under serialiseringen av ett utgående svar på servern eller av någon annan anledning kanske det inte returneras till klienten som ett fel.

  1. Skapa en instans av typen Person .

    var p = new Person();
    p.name = "John";
    p.age = 42;
    
  2. Serialisera objektet Person till en minnesström med hjälp DataContractJsonSerializerav .

    var stream1 = new MemoryStream();
    var ser = new DataContractJsonSerializer(typeof(Person));
    
  3. WriteObject Använd metoden för att skriva JSON-data till dataströmmen.

    ser.WriteObject(stream1, p);
    
  4. Visa JSON-utdata.

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

Så här deserialiserar du en instans av typen Person från JSON

  1. Deserialisera JSON-kodade data till en ny instans av Person med hjälp ReadObject av metoden för DataContractJsonSerializer.

    stream1.Position = 0;
    var p2 = (Person)ser.ReadObject(stream1);
    
  2. Visa resultatet.

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

Exempel

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

Kommentar

JSON-serialiseraren genererar ett serialiseringsfel för datakontrakt som har flera medlemmar med samma namn, vilket visas i följande exempelkod.

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

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

Se även