Beispiel zur schwach typisierten JSON-SerialisierungWeakly-typed JSON Serialization Sample

Beim Serialisieren eines benutzerdefinierten Typs in ein bestimmtes Übertragungsformat oder beim Deserialisieren eines Übertragungsformats zurück in einen benutzerdefinierten Typ muss der jeweilige benutzerdefinierte Typ für den Dienst und den Client verfügbar sein.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. Hierzu wird normalerweise das DataContractAttribute -Attribut auf diese benutzerdefinierten Typen angewendet, und das DataMemberAttribute -Attribut wird auf ihre Member angewendet.Usually to accomplish this, the DataContractAttribute attribute is applied to these user-defined types and the DataMemberAttribute attribute is applied to their members. Dieser Mechanismus wird auch beim Arbeiten mit JavaScript Object Notation (JSON)-Objekten verwendet, wie im Thema How to: Serialize and Deserialize JSON Databeschrieben.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 einigen Szenarien muss einen Windows Communication Foundation (WCF)-Dienst oder Client Zugriff auf JSON-Objekten, die von einem Dienst oder Client außerhalb der Kontrolle des Entwicklers generiert.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. Da mehr Webdienste JSON-APIs öffentlich verfügbar machen, kann die Dokumentanzahl für den WCF-Entwickler zum Erstellen von lokaler, benutzerdefinierten Typen in die beliebige JSON-Objekte deserialisiert werden.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. Dieses Beispiel stellt einen Mechanismus, der Entwicklern von WCF mit deserialisierten beliebigen JSON-Objekten arbeiten, ohne benutzerdefinierte Typen erstellen zu können.This sample provides a mechanism that enables WCF developers to work with deserialized, arbitrary JSON objects, without creating user-defined types. Dies wird als schwach typisierte Deserialisierung von JSON-Objekten bezeichnet, da der Typ, in den ein JSON-Objekt deserialisiert wird, zum Zeitpunkt der Kompilierung nicht bekannt ist.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.

Hinweis

Die Setupprozedur und die Buildanweisungen für dieses Beispiel befinden sich am Ende dieses Themas.The setup procedure and build instructions for this sample are located at the end of this topic.

Beispielsweise gibt eine öffentliche Webdienst-API das folgende JSON-Objekt zurück, das Informationen zu einem Benutzer des Diensts enthält.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"]}  

Dieses Objekt zu deserialisieren, muss ein WCF-Client die folgenden benutzerdefinierten Typen implementieren.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;  
 }  

Dies kann aufwändig sein, insbesondere, wenn der Client mehrere Typen von JSON-Objekten behandeln muss.This can be cumbersome, especially if the client has to handle more than one type of JSON object.

Der in diesem Beispiel bereitgestellte JsonObject -Typ führt eine schwach typisierte Darstellung des deserialisierten JSON-Objekts ein.The JsonObject type provided by this sample introduces a weakly-typed representation of the deserialized JSON object. JsonObject verwendet die natürliche Zuordnung zwischen JSON-Objekten und .NET Framework.NET Framework -Wörterbüchern und die Zuordnung zwischen JSON-Arrays und .NET Framework.NET Framework -Arrays.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. Der folgende Code veranschaulicht den JsonObject -Typ: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]  
                                    };  

Sie können JSON-Objekte und -Arrays "durchsuchen", ohne ihren Typ zum Zeitpunkt der Kompilierung deklarieren zu müssen.Note that you can "browse" JSON objects and arrays without the need to declare their type at compile time. Eine Erläuterung der Anforderungen für das ["root"] -Objekt der obersten Ebene finden Sie im Thema Mapping Between JSON and XMLbeschrieben.For an explanation of the requirement for the top-level ["root"] object, see the topic Mapping Between JSON and XML.

Hinweis

Die JsonObject -Klasse wird nur als Beispiel bereitgestellt.The JsonObject class is provided as an example only. Sie wurde nicht gründlich getestet und sollte nicht in Produktionsumgebungen verwendet werden.It has not been thoroughly tested, and should not be used in production environments. Eine offensichtliche Implikation der schwach typisierten JSON-Serialisierung ist der Mangel an Typsicherheit beim Arbeiten mit JsonObject.An obvious implication of weakly-typed JSON serialization is the lack of type-safety when working with JsonObject.

Damit der JsonObject -Typ verwendet werden kann, muss der Clientvorgangsvertrag Message als Rückgabetyp verwenden.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();  
    }  

JsonObject wird dann instanziiert, wie im folgenden Code dargestellt.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);  

Der JsonObject -Konstruktor nimmt einen XmlDictionaryReaderan, der durch die GetReaderAtBodyContents -Methode abgerufen wird.The JsonObject constructor takes a XmlDictionaryReader, which is obtained through the GetReaderAtBodyContents method. Der Reader enthält eine XML-Darstellung der vom Client empfangenen JSON-Nachricht.The reader contains an XML representation of the JSON message received by the client. Weitere Informationen finden Sie im Thema Zuordnung zwischen JSON und XML-.For more information, see the topic Mapping Between JSON and XML.

Das Programm erzeugt die folgende Ausgabe: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.  

So können Sie das Beispiel einrichten, erstellen und ausführenTo set up, build, and run the sample

  1. Stellen Sie sicher, dass Sie ausgeführt haben die Setupprozedur für die Windows Communication Foundation-Beispiele zum einmaligen.Ensure that you have performed the One-Time Setup Procedure for the Windows Communication Foundation Samples.

  2. Erstellen Sie die Projektmappe "WeaklyTypedJson.sln", wie in Building the Windows Communication Foundation Samplesbeschrieben.Build the solution WeaklyTypedJson.sln as described in Building the Windows Communication Foundation Samples.

  3. Führen Sie die Projektmappe aus.Run the solution.

Wichtig

Die Beispiele sind möglicherweise bereits auf dem Computer installiert.The samples may already be installed on your machine. Suchen Sie nach dem folgenden Verzeichnis (Standardverzeichnis), bevor Sie fortfahren.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Wenn dieses Verzeichnis nicht vorhanden ist, fahren Sie mit Windows Communication Foundation (WCF) und Windows Workflow Foundation (WF) Samples for .NET Framework 4 aller Windows Communication Foundation (WCF) herunterladen und WFWF Beispiele.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. Dieses Beispiel befindet sich im folgenden Verzeichnis.This sample is located in the following directory.

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

Siehe auchSee Also