Partager via


Weakly-typed JSON Serialization, exemple

Lors de la sérialisation d'un type défini par l'utilisateur dans un format de transmission donné, ou de la désérialisation d'un format de transmission dans un type défini par l'utilisateur, le type défini par l'utilisateur donné doit être disponible à la fois sur le service et sur le client. En général, l'attribut DataContractAttribute est alors appliqué à ces types définis par l'utilisateur, et l'attribut DataMemberAttribute est appliqué à leurs membres. Ce mécanisme s'applique également à l'utilisation d'objets JSON (JavaScript Object Notation), comme le décrit la rubrique How to: Serialize and Deserialize JSON Data.

Dans certains scénarios, un service ou un client Windows Communication Foundation (WCF) doit accéder aux objets JSON générés par un service ou un client qui échappe au contrôle du développeur. Comme de plus en plus de services Web exposent publiquement des API JSON, il peut devenir difficile pour le développeur WCF de générer des types définis par l'utilisateur local dans lesquels désérialiser des objets JSON arbitraires. Cet exemple fournit un mécanisme qui permet aux développeurs WCF d'utiliser des objets JSON arbitraires désérialisés, sans créer des types définis par l'utilisateur. C'est ce que l'on appelle la sérialisation faiblement typée d'objets JSON, parce que le type dans lequel un objet JSON est désérialisé n'est pas connu au moment de la compilation.

Bb943471.note(fr-fr,VS.90).gifRemarque :
Cet exemple requiert l'installation de .NET Framework version 3.5 pour pouvoir être généré et exécuté. Visual Studio 2008 est requis pour l'ouverture des fichiers solution et projet.

Bb943471.note(fr-fr,VS.90).gifRemarque :
La procédure d'installation ainsi que les instructions de génération relatives à cet exemple figurent en fin de rubrique.

Par exemple, une API de service Web publique retourne l'objet JSON suivant, qui contient des informations à propos d'un utilisateur du service.

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

Pour désérialiser cet objet, un client WCF doit implémenter les types définis par l'utilisateur suivants.

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

Cela peut être gênant, surtout si le client doit gérer plusieurs types d'objets JSON.

Le type JsonObject fourni par cet exemple introduit une représentation faiblement typée de l'objet JSON désérialisé. JsonObject compte sur le mappage naturel entre les objets JSON et les dictionnaires de .NET Framework, et le mappage entre les tableaux JSON range et les tableaux de .NET Framework. Le code suivant illustre le type JsonObject.

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

Notez que vous pouvez « parcourir » des objets et tableaux JSON sans avoir besoin de déclarer leur type au moment de la compilation. Pour obtenir une explication de la spécification requise pour l'objet ["root"] de niveau supérieur, consultez le rubrique Mapping Between JSON and XML.

Bb943471.note(fr-fr,VS.90).gifRemarque :
La classe JsonObject est fournie uniquement à titre d'exemple. Elle n'a pas été testée entièrement et ne doit pas être utilisée dans les environnements de production. L'une des conséquences évidentes de la sérialisation JSON faiblement typée est le manque de sécurité du type lors de l'utilisation de JsonObject.

Pour utiliser le type JsonObject, le contrat d'opération cliente doit utiliser Message comme type de retour.

[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();
    }

Le JsonObject est ensuite instancié comme le montre le code suivant.

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

Le constructeur JsonObject prend un XmlDictionaryReader, obtenu par l'intermédiaire de la méthode GetReaderAtBodyContents. Le lecteur contient une représentation XML du message JSON reçu par le client. Pour plus d'informations, consultez la rubrique Mapping Between JSON and XML.

Le programme génère la sortie suivante :

Service listening at https://localhost:8000/.
To view the JSON output from the sample, navigate to https://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.

Pour configurer, générer et exécuter l'exemple

  1. Assurez-vous d'avoir effectué la procédure indiquée à la section Procédure d'installation unique pour les exemples Windows Communication Foundation.

  2. Générez la solution WeaklyTypedJson.sln telle que décrite dans la section Génération des exemples Windows Communication Foundation.

  3. Exécutez la solution.

Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.