先の記事 WCF と jQuery AJAX では、JSON 文字列をデータとしてやり取りする WCF サービスのメソッドを、jQuery.ajax を使って呼び出してデータを取得する方法を書きました。
この WCF サービスのメソッドを HttpWebRequest / HttpWebResponse を利用して呼び出して JSON 文字列のデータを取得し、それを逆シリアル化して C# のオブジェクトに変換する方法を書きます。
ここでは例として先の記事の WCF サービスの GetCarsByDoors(int doors) メソッドを POST 要求してみます。
まず、JSON 文字列が逆シリアル化された際の C# のクラス / プロパティを書き、それらに DataContract / DataMember 属性を付与してデータコントラクトを定義します。
JSON 文字列から C# のクラス / プロパティの変換は json2csharp のような変換サービスを利用すると簡単にできると思います。
先の記事のコードでは、WCF サービスの GetCarsByDoors(int doors) メソッドの応答の JSON 文字列は "GetCarsByDoorsResult" でラップされるように設定されていますので、それを考慮して以下のようなデータコントラクト定義になります。
[DataContract]
public class RootObject
{
// GetCarsByDoorsResult は WCF サービスメソッドに付与した
// BodyStyle = WebMessageBodyStyle.WrappedRequest による
// ラップの名前(ラップするのはセキュリティ対策)
[DataMember]
public List<Car> GetCarsByDoorsResult { get; set; }
}
[DataContract]
public class Car
{
[DataMember]
public string Make { get; set; }
[DataMember]
public string Model { get; set; }
[DataMember]
public int Year { get; set; }
[DataMember]
public int Doors { get; set; }
[DataMember]
public string Colour { get; set; }
[DataMember]
public float Price { get; set; }
}
HttpWebRequest を利用して WCF サービスの GetCarsByDoors(int doors) メソッドを要求し JSON 文字列をデータとして POST 送信します。ここでは例として "{\"doors\":5}" という 5 ドア車を要求する JSON 文字列を設定しています。
HttpWebResponse を利用して応答を取得し、DataContractJsonSerializer クラスを利用して応答ストリームに含まれる JSON 文字列を C# のオブジェクトにデシリアライズします。
詳しくは以下のサンプルコードとそれに付与したコメントを見てください。
using System;
using System.Net;
using System.Text;
using System.IO;
using System.Runtime.Serialization;
using System.Collections.Generic;
using System.Runtime.Serialization.Json;
namespace ConsoleApplication7
{
class Program
{
static void Main(string[] args)
{
// 指定した Uri を要求する HttpWebRequest を初期化
HttpWebRequest endpointRequest =
(HttpWebRequest)HttpWebRequest.
Create("http://.../carservice.svc/GetCarsByDoors");
endpointRequest.Method = "POST";
endpointRequest.ContentType =
"application/json; charset=utf-8";
// POST データの設定。とりあえず 5 ドアを要求してみる
string postData = "{\"doors\":5}";
Encoding encoding = Encoding.GetEncoding("utf-8");
byte[] byte1 = encoding.GetBytes(postData);
endpointRequest.ContentLength = byte1.Length;
// POST データを書き込むストリームを取得
using (Stream requestStream =
endpointRequest.GetRequestStream())
{
// POST データを要求ストリームに書き込み
requestStream.Write(byte1, 0, byte1.Length);
// WCF サービスメソッドからの応答を取得
using (HttpWebResponse endpointResponse =
(HttpWebResponse)endpointRequest.GetResponse())
{
// 応答のコンテンツを読むストリームを取得
using (Stream responseStream =
endpointResponse.GetResponseStream())
{
// JSON シリアライザの初期化
DataContractJsonSerializer ser =
new DataContractJsonSerializer(typeof(RootObject));
// 応答のコンテンツを逆シリアル化して C# の
// オブジェクトを取得
RootObject rootObject =
(RootObject)ser.ReadObject(responseStream);
foreach (Car car in rootObject.GetCarsByDoorsResult)
{
Console.WriteLine("Make:{0}, Model:{1}, Doors:{2}",
car.Make, car.Model, car.Doors);
/*
結果は:
Make:Audi, Model:A4, Doors:5
Make:Ford, Model:Focus, Doors:5
Make:Renault, Model:Laguna, Doors:5
Make:Toyota, Model:Previa, Doors:5
*/
}
}
}
}
}
}
}
DataContractJsonSerializer クラスを利用したシリアル化 / 逆シリアル化については、MSDN ライブラリの記事「方法 : JSON データをシリアル化および逆シリアル化する」が参考になると思います。