Procedura: serializzare e deserializzare dati JSON

JSON (JavaScript Object Notation) è un efficiente formato di codifica dati che consente scambi rapidi di piccole quantità di dati tra browser client e servizi Web compatibili con AJAX.

In questo argomento viene descritto come serializzare oggetti di tipo .NET in dati con codifica JSON e quindi come deserializzare i dati in formato JSON in istanze di tipi .NET utilizzando DataContractJsonSerializer. In questo esempio viene utilizzato un contratto dati per illustrare la serializzazione e la deserializzazione di un tipo Person definito dall'utente.

In genere, la serializzazione e la deserializzazione JSON vengono gestite automaticamente da Windows Communication Foundation (WCF) quando si utilizzano tipi di contratto dati nelle operazioni del servizio esposte su endpoint compatibili con AJAX. Tuttavia, in alcuni casi potrebbe essere necessario utilizzare direttamente dati JSON, come nel caso dello scenario descritto in questo argomento.

Nota

Se si verifica un errore durante la serializzazione di una risposta in uscita nel server o se l'operazione di risposta genera un'eccezione per qualche altro motivo, è possibile che l'errore non venga restituito al client.

Questo argomento si basa sull'esempio JSON Serialization.

Per definire il contratto dati per Person

  1. Definire il contratto dati per Person collegando DataContractAttribute alla classe e l'attributo DataMemberAttribute ai membri da serializzare. Per ulteriori informazioni sui contratti dati, vedere Progettazione dei contratti di servizio.

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

Per serializzare un'istanza di tipo Person in JSON

  1. Creare un'istanza del tipo Person.

    Person p = new Person();
    p.name = "John";
    p.age = 42;
    
  2. Serializzare l'oggetto Person in un flusso di memoria utilizzando DataContractJsonSerializer.

    MemoryStream stream1 = new MemoryStream();
    DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Person));
    
  3. Utilizzare il metodo WriteObject per scrivere dati JSON nel flusso.

    ser.WriteObject(stream1, p);
    
  4. Visualizzare l'output JSON.

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

Per deserializzare un'istanza di tipo Person da JSON

  1. Deserializzare i dati con codifica JSON in una nuova istanza di Person utilizzando il metodo ReadObject di DataContractJsonSerializer.

    stream1.Position = 0;
    Person p2 = (Person)ser.ReadObject(stream1);
    
  2. Visualizzare i risultati.

    Console.Write("Deserialized back, got name=");
    Console.Write(p2.name);
    Console.Write(", age=");
    Console.WriteLine(p2.age);
    

Esempio

Nota

Il serializzatore JSON genera un'eccezione di serializzazione per i contratti dati che dispongono di più membri con lo stesso nome, come illustrato nel codice di esempio seguente.

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

Vedere anche

Concetti

Serializzazione JSON autonoma
Supporto per JSON e altri formati di trasferimento dati