弱い型指定の JSON のシリアル化のサンプルWeakly-typed JSON Serialization Sample

特定のワイヤ形式にユーザー定義型をシリアル化するときや、ユーザー定義型にワイヤ形式を逆シリアル化するときは、そのユーザー定義型がサービスとクライアントの両方で使用可能である必要があります。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. 通常、これを実現するために、 DataContractAttribute 属性がこのユーザー定義型に適用され、 DataMemberAttribute 属性がそのメンバに適用されます。Usually to accomplish this, the DataContractAttribute attribute is applied to these user-defined types and the DataMemberAttribute attribute is applied to their members. この機構は、「 How to: Serialize and Deserialize JSON Data」トピックで説明されているように、JavaScript Object Notation (JSON) オブジェクトを使用する場合にも適用されます。This mechanism also applies when working with JavaScript Object Notation (JSON) objects, as described in the topic How to: Serialize and Deserialize JSON Data.

シナリオによっては、Windows 通信基盤 (WCF) サービスまたはクライアントは、開発者の制御の範囲外にあるサービスまたはクライアントによって生成された JSON オブジェクトにアクセスする必要があります。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. JSON API を公開する Web サービスが増えるほど、任意の JSON オブジェクトを逆シリアル化するローカルのユーザー定義型を WCF 開発者が構築することは現実的ではありません。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. このサンプルでは、ユーザー定義型を作成せずに、逆シリアル化された任意の JSON オブジェクトを使用する WCF 開発者を使用できるようにするメカニズムを提供します。This sample provides a mechanism that enables WCF developers to work with deserialized, arbitrary JSON objects, without creating user-defined types. このしくみは、JSON オブジェクトが逆シリアル化される型がコンパイル時に不明なため、JSON オブジェクトの 弱い型指定のシリアル化 と呼ばれます。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.

注意

このサンプルのセットアップ手順とビルド手順については、このトピックの最後を参照してください。The setup procedure and build instructions for this sample are located at the end of this topic.

たとえば、パブリック Web サービスの API によって、このサービスのユーザーに関する情報の一部を記述した次の JSON オブジェクトが返されるとします。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"]}  

このオブジェクトを逆シリアル化するには、WCF クライアントは、次のユーザー定義型を実装する必要があります。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;  
 }  

この手順は、特にクライアントが複数の型の JSON オブジェクトを処理する必要がある場合に、複雑になる可能性があります。This can be cumbersome, especially if the client has to handle more than one type of JSON object.

このサンプルで示す JsonObject 型では、逆シリアル化された JSON オブジェクトの弱い型指定の表現を使用します。The JsonObject type provided by this sample introduces a weakly-typed representation of the deserialized JSON object. JsonObjectJSON オブジェクトと .NET Framework ディクショナリの間の自然なマッピング、および JSON 配列と .NET Framework 配列の間のマッピングに依存します。JsonObject relies on the natural mapping between JSON objects and .NET Framework dictionaries, and the mapping between JSON arrays and .NET Framework arrays. 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]  
                                    };  

コンパイル時に型を宣言せずに、JSON オブジェクトと配列を "参照" できます。Note that you can "browse" JSON objects and arrays without the need to declare their type at compile time. トップレベルの ["root"] オブジェクトの詳細については、「 Mapping Between JSON and XML」トピックで説明されているように、JavaScript Object Notation (JSON) オブジェクトを使用する場合にも適用されます。For an explanation of the requirement for the top-level ["root"] object, see the topic Mapping Between JSON and XML.

注意

JsonObject クラスは、例としてのみ提供されています。The JsonObject class is provided as an example only. テストが完全には行われていないため、運用環境では使用しないでください。It has not been thoroughly tested, and should not be used in production environments. 弱い型指定の JSON のシリアル化の明確な影響の 1 つは、 JsonObjectの使用時にタイプ セーフがなくなることです。An obvious implication of weakly-typed JSON serialization is the lack of type-safety when working with JsonObject.

JsonObject 型を使用するには、クライアント操作コントラクトで Message を戻り値の型として使用する必要があります。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 がインスタンス化されます。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);  

JsonObject コンストラクタは、 XmlDictionaryReaderメソッドを使用して取得される GetReaderAtBodyContents を受け取ります。The JsonObject constructor takes a XmlDictionaryReader, which is obtained through the GetReaderAtBodyContents method. リーダーには、クライアントによって受信された JSON メッセージの XML 表現が含まれています。The reader contains an XML representation of the JSON message received by the client. 詳細については、トピック「JSON と XML のマッピング」を参照してください。For more information, see the topic Mapping Between JSON and XML.

このプログラムの出力は、次のようになります。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.  

サンプルをセットアップ、ビルド、および実行するにはTo set up, build, and run the sample

  1. Windows コミュニケーションファウンデーション サンプルのワンタイム セットアップ手順を実行したことを確認します。Ensure that you have performed the One-Time Setup Procedure for the Windows Communication Foundation Samples.

  2. Building the Windows Communication Foundation Samples」の説明に従って、ソリューション WeaklyTypedJson.sln をビルドします。Build the solution WeaklyTypedJson.sln as described in Building the Windows Communication Foundation Samples.

  3. ソリューションを実行するRun the solution.

重要

サンプルは、既にコンピューターにインストールされている場合があります。The samples may already be installed on your machine. 続行する前に、次の (既定の) ディレクトリを確認してください。Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

このディレクトリが存在しない場合は、.NET Framework 4 の Windows コミュニケーション ファウンデーション (WCF) および Windows ワークフローファウンデーション (WF) サンプルに移動して、すべての Windows 通信基盤 (WCF) とサンプルをWFWFダウンロードします。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. このサンプルは、次のディレクトリに格納されます。This sample is located in the following directory.

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