Esempio di serializzazione JSON con tipizzazione deboleWeakly-typed JSON Serialization Sample

Quando si serializza un tipo definito dall'utente in un formato di trasmissione specificato o si deserializza un formato di trasmissione in un tipo definito dall'utente, il tipo definito dall'utente specificato deve essere disponibile sia nel servizio che nel client.When serializing a user-defined type to a given wire format, or deserializing a wire format back into a user-defined type, the given user-defined type must be available on both the service and the client. Per eseguire questa operazione, in genere l'attributo DataContractAttribute viene applicato ai tipi definiti dall'utente e l'attributo DataMemberAttribute viene applicato ai relativi membri.Usually to accomplish this, the DataContractAttribute attribute is applied to these user-defined types and the DataMemberAttribute attribute is applied to their members. Questo meccanismo viene applicato anche quando si usano oggetti JSON (JavaScript Object Notation), come descritto nell'argomento How to: Serialize and Deserialize JSON Data.This mechanism also applies when working with JavaScript Object Notation (JSON) objects, as described in the topic How to: Serialize and Deserialize JSON Data.

In alcuni scenari, un servizio Windows Communication Foundation (WCF) o un client deve accedere a oggetti JSON generati da un servizio o client non controllabili dallo sviluppatore.In some scenarios, a Windows Communication Foundation (WCF) service or client must access JSON objects generated by a service or client that is outside of the control of the developer. Poiché il numero di servizi Web che espone pubblicamente API JSON, può diventare arduo per lo sviluppatore WCF costruire tipi definiti dall'utente locali nei quali deserializzare gli oggetti JSON arbitrari.As more Web services publicly expose JSON APIs, it can become impractical for the WCF developer to construct local user-defined types into which to deserialize arbitrary JSON objects. In questo esempio fornisce un meccanismo che consente agli sviluppatori WCF di utilizzare oggetti arbitrari deserializzati JSON, senza creare tipi definiti dall'utente.This sample provides a mechanism that enables WCF developers to work with deserialized, arbitrary JSON objects, without creating user-defined types. Questo meccanismo è noto come serializzazione con tipizzazione debole di oggetti JSON, perché il tipo nel quale viene deserializzato un oggetto JSON non è noto in fase di compilazione.This is known as weakly-typed serialization of JSON objects, because the type into which a JSON object deserializes is not known at compile time.

Nota

La procedura di installazione e le istruzioni di compilazione per questo esempio si trovano alla fine di questo argomento.The setup procedure and build instructions for this sample are located at the end of this topic.

Ad esempio, l'API di un servizio Web pubblico restituisce l'oggetto JSON seguente che fornisce alcune informazioni su un utente del servizio.For example, a public Web service API returns the following JSON object, which describes some information about a user of the service.

{"personal": {"name": "Paul", "age": 23, "height": 1.7, "isSingle": true, "luckyNumbers": [5,17,21]}, "favoriteBands": ["Band ABC", "Band XYZ"]}  

Per deserializzare questo oggetto, un client WCF deve implementare i seguenti tipi definiti dall'utente.To deserialize this object, a WCF client must implement the following user-defined types.

[DataContract]  
 public class MemberProfile  
 {  
     [DataMember]  
     public PersonalInfo personal;  

     [DataMember]  
     public string[] favoriteBands;  
 }  

 [DataContract]  
 public class PersonalInfo  
 {  
     [DataMember]  
     public string name;  

     [DataMember]  
     public int age;  

     [DataMember]  
     public double height;  

     [DataMember]  
     public bool isSingle;  

     [DataMember]  
     public int[] luckyNumbers;  
 }  

Questa operazione può risultare ardua, specialmente se il client deve gestire più di un tipo di oggetto JSON.This can be cumbersome, especially if the client has to handle more than one type of JSON object.

Il tipo JsonObject fornito in questo esempio introduce una rappresentazione con tipizzazione debole dell'oggetto JSON deserializzato.The JsonObject type provided by this sample introduces a weakly-typed representation of the deserialized JSON object. JsonObject si basa sul mapping naturale tra oggetti JSON e dizionari .NET Framework.NET Framework e sul mapping tra matrici JSON e matrici .NET Framework.NET Framework .JsonObject relies on the natural mapping between JSON objects and .NET Framework.NET Framework dictionaries, and the mapping between JSON arrays and .NET Framework.NET Framework arrays. Nel codice seguente viene illustrato il tipo JsonObject .The following code shows the JsonObject type.

// Instantiation of JsonObject json omitted  

string name = json["root"]["personal"]["name"];  
int age = json["root"]["personal"]["age"];  
double height = json["root"]["personal"]["height"];  
bool isSingle = json["root"]["personal"]["isSingle"];  
int[] luckyNumbers = {  
                                     json["root"]["personal"]["luckyNumbers"][0],  
                                     json["root"]["personal"]["luckyNumbers"][1],  
                                     json["root"]["personal"]["luckyNumbers"][2]   
                                 };  
string[] favoriteBands = {  
                                        json["root"]["favoriteBands"][0],  
                                        json["root"]["favoriteBands"][1]  
                                    };  

Si noti che è possibile "esplorare" oggetti JSON e matrici senza doverne dichiarare il tipo in fase di compilazione.Note that you can "browse" JSON objects and arrays without the need to declare their type at compile time. Per una spiegazione dei requisiti per l'oggetto ["root"] di primo livello, vedere l'argomento Mapping Between JSON and XML.For an explanation of the requirement for the top-level ["root"] object, see the topic Mapping Between JSON and XML.

Nota

La classe JsonObject viene fornita a solo scopo esemplificativo.The JsonObject class is provided as an example only. Non è stata testata completamente e non deve essere utilizzata negli ambienti di produzione.It has not been thoroughly tested, and should not be used in production environments. Un'implicazione ovvia della serializzazione JSON con tipizzazione debole è la mancanza di indipendenza dai tipi quando si utilizza JsonObject.An obvious implication of weakly-typed JSON serialization is the lack of type-safety when working with JsonObject.

Per utilizzare il tipo JsonObject , il contratto dell'operazione client deve utilizzare Message come tipo restituito.To use the JsonObject type, the client operation contract must use Message as its return type.

[ServiceContract]  
    interface IClientSideProfileService  
    {  
        // There is no need to write a DataContract for the complex type returned by the service.  
        // The client will use a JsonObject to browse the JSON in the received message.  

        [OperationContract]  
        [WebGet(ResponseFormat = WebMessageFormat.Json)]  
        Message GetMemberProfile();  
    }  

Viene quindi creata un'istanza di JsonObject come illustrato nel codice seguente.The JsonObject is then instantiated as shown in the following code.

// Code to instantiate IClientSideProfileService channel omitted…  

// Make a request to the service and obtain the Json response  
XmlDictionaryReader reader = channel.GetMemberProfile().GetReaderAtBodyContents();  

// Go through the Json as though it is a dictionary. There is no need to map it to a .NET CLR type.  
JsonObject json = new JsonObject(reader);  

Il costruttore JsonObject accetta una classe XmlDictionaryReader, ottenuta tramite il metodo GetReaderAtBodyContents .The JsonObject constructor takes a XmlDictionaryReader, which is obtained through the GetReaderAtBodyContents method. Il lettore contiene una rappresentazione XML del messaggio JSON ricevuto dal client.The reader contains an XML representation of the JSON message received by the client. Per altre informazioni, vedere l'argomento Mapping tra JSON e XML.For more information, see the topic Mapping Between JSON and XML.

Il programma produce l'output seguente:The program produces the following output:

Service listening at http://localhost:8000/.  
To view the JSON output from the sample, navigate to http://localhost:8000/GetMemberProfile  
This is Paul's page. I am 23 years old and I am 1.7 meters tall.  
I am single.  
My lucky numbers are 5, 17, and 21.  
My favorite bands are Band ABC and Band XYZ.  

Per impostare, compilare ed eseguire l'esempioTo set up, build, and run the sample

  1. Assicurarsi di avere eseguito la procedura di installazione singola per gli esempi di Windows Communication Foundation.Ensure that you have performed the One-Time Setup Procedure for the Windows Communication Foundation Samples.

  2. Compilare la soluzione WeaklyTypedJson.sln come descritto in Building the Windows Communication Foundation Samples.Build the solution WeaklyTypedJson.sln as described in Building the Windows Communication Foundation Samples.

  3. Eseguire la soluzione.Run the solution.

Importante

È possibile che gli esempi siano già installati nel computer.The samples may already be installed on your machine. Verificare la directory seguente (impostazione predefinita) prima di continuare.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Se questa directory non esiste, andare al Windows Communication Foundation (WCF) e gli esempi di Windows Workflow Foundation (WF) per .NET Framework 4 per scaricare tutti i Windows Communication Foundation (WCF) e WFWF esempi.If this directory does not exist, go to Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 to download all Windows Communication Foundation (WCF) and WFWF samples. Questo esempio si trova nella directory seguente.This sample is located in the following directory.

<InstallDrive>:\WF_WCF_Samples\WCF\Scenario\Ajax\WeaklyTypedJson

Vedere ancheSee Also