Delen via


Zwak getypeerd JSON-serialisatievoorbeeld

Bij het serialiseren van een door de gebruiker gedefinieerd type in een bepaalde draadindeling of het deserialiseren van een draadindeling in een door de gebruiker gedefinieerd type, moet het opgegeven door de gebruiker gedefinieerde type beschikbaar zijn voor zowel de service als de client. Om dit te bereiken, wordt het kenmerk toegepast op deze door de DataContractAttribute gebruiker gedefinieerde typen en wordt het DataMemberAttribute kenmerk toegepast op hun leden. Dit mechanisme is ook van toepassing bij het werken met JSON-objecten (JavaScript Object Notation), zoals beschreven in het onderwerp Procedure: JSON-gegevens serialiseren en deserialiseren.

In sommige scenario's moet een WCF-service (Windows Communication Foundation) of -client toegang hebben tot JSON-objecten die zijn gegenereerd door een service of client die buiten het beheer van de ontwikkelaar valt. Naarmate meer webservices JSON-API's openbaar maken, kan het onpraktisch worden voor de WCF-ontwikkelaar om lokale door de gebruiker gedefinieerde typen te maken waarin willekeurige JSON-objecten moeten worden gedeserialaliseerd.

Het Voorbeeld WeaklyTypedJson biedt een mechanisme waarmee WCF-ontwikkelaars kunnen werken met gedeserialiseerde, willekeurige JSON-objecten zonder door de gebruiker gedefinieerde typen te maken. Dit staat bekend als zwak getypte serialisatie van JSON-objecten, omdat het type waarin een JSON-object deserializes niet bekend is tijdens het compileren.

Een openbare webservice-API retourneert bijvoorbeeld het volgende JSON-object, waarin enkele informatie over een gebruiker van de service wordt beschreven.

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

Als u dit object wilt deserialiseren, moet een WCF-client de volgende door de gebruiker gedefinieerde typen implementeren.

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

Dit kan lastig zijn, vooral als de client meer dan één type JSON-object moet verwerken.

Het JsonObject type dat door dit voorbeeld wordt geleverd, introduceert een zwak getypeerde weergave van het gedeserialiseerde JSON-object. JsonObject is afhankelijk van de natuurlijke toewijzing tussen JSON-objecten en .NET Framework-woordenlijsten en de toewijzing tussen JSON-matrices en .NET Framework-matrices. De volgende code toont het 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]
                                    };

U kunt JSON-objecten en matrices 'bladeren' zonder dat u hun type tijdens het compileren hoeft te declareren. Zie het onderwerpToewijzing tussen JSON en XML voor een uitleg van de vereiste voor het object op het hoogste niveau["root"].

Notitie

De JsonObject klasse wordt alleen als voorbeeld gegeven. Het is niet grondig getest en mag niet worden gebruikt in productieomgevingen. Een duidelijke implicatie van zwak getypte JSON-serialisatie is het gebrek aan typeveiligheid bij het werken met JsonObject.

Als u het JsonObject type wilt gebruiken, moet het clientbewerkingscontract als retourtype worden gebruikt Message .

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

De JsonObject code wordt vervolgens geïnstantieerd, zoals wordt weergegeven in de volgende 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);

De JsonObject constructor neemt een XmlDictionaryReader, die wordt verkregen via de GetReaderAtBodyContents methode. De lezer bevat een XML-weergave van het JSON-bericht dat door de client is ontvangen. Zie het onderwerpToewijzing tussen JSON en XML voor meer informatie.

Het programma produceert de volgende uitvoer:

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.

Het voorbeeld instellen, compileren en uitvoeren

  1. Zorg ervoor dat u de eenmalige installatieprocedure voor de Windows Communication Foundation-voorbeelden hebt uitgevoerd.

  2. Bouw de oplossing WeaklyTypedJson.sln zoals beschreven in het bouwen van de Windows Communication Foundation-voorbeelden.

  3. Voer de oplossing uit.