Webサービスで公開されているJSONデータの読み込み
DynamicJSONライブラリの実用的なサンプルとして、実際のWebサービスで公開されているJSONデータの読み込みを行ってみましょう。
今回使用するWebサービスは、株式会社リコーが公開している郵便番号検索Webサービス「ricollab」です。このWebサービスでは、郵便番号からの住所検索や、住所からの郵便番号検索などのサービスが提供されており、結果はXML形式とJSON形式で取得できます。今回はricollabのWebサービスのうち、郵便番号から住所を検索するサービスをJSON形式で使用し、郵便番号と住所の一覧を取得してみましょう。
ricollabのWebサービスは、URLのクエリストリングでパラメータを指定する仕様となっています。今回は「http://zip.ricollab.jp/search?q={郵便番号}&type=json」というURLにアクセスし、郵便番号から住所を検索します。検索結果のデータは以下のようなJSONデータになります。
{
"query": "112",
"totalResults": 101,
"itemsPerPage": 10,
"next": "http://zip.ricollab.jp/search?page=2&q=112&type=json",
"result": [
{
"zipcode": "1120000",
"address": "東京都文京区以下に掲載がない場合",
"link": "http://zip.ricollab.jp/1120000"
},
{
"zipcode": "1120001",
"address": "東京都文京区白山(2-5丁目)",
"link": "http://zip.ricollab.jp/1120001"
},
{
"zipcode": "1120002",
"address": "東京都文京区小石川",
"link": "http://zip.ricollab.jp/1120002"
},
・・・中略・・・
{
"zipcode": "1120013",
"address": "東京都文京区音羽",
"link": "http://zip.ricollab.jp/1120013"
}
]
}
このJSONデータは、以下のような構造をしています。データ内に配列が含まれるなど、先ほどサンプルで扱ったものよりも格段に複雑なデータであることが分かります。

各データ項目は以下のようなデータを表しています。
| キー | 意味 |
| query | 検索文字列 |
| totalResults | 検索でヒットしたデータの件数 |
| itemsPerPage | このJSONデータに含まれるデータの件数 |
| next | 次の検索結果のURL |
| result | 検索結果データの配列 |
| zipcode | 郵便番号 |
| address | 住所 |
| link | 詳細情報のURL |
今回は検索結果のzipcodeとaddressを抜き出し、郵便番号検索結果を一覧表示することにします。実際のコードは以下のようになります。
private static void PostalCodeSample()
{
//アクセスするURL。「112」で始まる郵便番号一覧を検索
var url = "http://zip.ricollab.jp/search?q=112&type=json";
//(1)Webサービスアクセスのためのクラス
var client = new System.Net.WebClient();
//(2)リコー郵便番号検索Webサービスからデータをbyte配列としてダウンロード
byte[] bytes = client.DownloadData(url);
//(3)UTF-8形式で文字列に変換
string jsonData = System.Text.Encoding.UTF8.GetString(bytes);
//(4)DynamicJsonクラスのParseメソッドでdynamicオブジェクトに変換
var data = DynamicJson.Parse(jsonData);
//(5)resultプロパティに配列が含まれているので、検索結果ごとにループ
foreach (var item in data.result)
{
Console.WriteLine("Zipcode: {0}, Address: {1}",item.zipcode,item.address);
}
}
(1)、(2)、(3)では、HTTP通信を行うWebClientクラスを使い、Webサービスからデータをダウンロードし、文字列に変換しています。
(4)でParseメソッドによって取得したJSONデータをdynamicオブジェクトに変換します。ここで変換されたオブジェクトは、以下のように変換元のJSONデータと同様の構造を持っています。
今回出力したいデータはresultプロパティ内に含まれていますので、(5)のように、foreach文で1つずつ取り出して出力します。実行結果は以下のようになります。
Zipcode: 1120000, Address: 東京都文京区以下に掲載がない場合 Zipcode: 1120001, Address: 東京都文京区白山(2-5丁目) Zipcode: 1120002, Address: 東京都文京区小石川 Zipcode: 1120003, Address: 東京都文京区春日 Zipcode: 1120004, Address: 東京都文京区後楽 Zipcode: 1120005, Address: 東京都文京区水道 Zipcode: 1120006, Address: 東京都文京区小日向 Zipcode: 1120011, Address: 東京都文京区千石 Zipcode: 1120012, Address: 東京都文京区大塚 Zipcode: 1120013, Address: 東京都文京区音羽
このようにDynamicJSONを使うことで、わずかなコード(今回はWebサービスの呼び出しまで含めて20行足らず)で、JSONデータの処理を行うことができます。
まとめ
この記事では、DataContractJsonSerializerとDynamicJSONの使用方法を解説しました。DataContractJsonSerializerが、すでに存在する.NETクラスをJSONデータとして公開するケースには十分な機能を持っている一方で、さまざまなWebサービスで公開されているJSONデータを使用するケースでは、事前の定義が不要なDynamicJSONのメリットが際立ちます。それぞれの方法の特性を理解し、活用していきましょう。
本文では、.NET FrameworkでのJSON処理について扱いましたが、Webサービスとの連携が多いSilverlightは、バージョン2からJSONをサポートしています。このJSONサポートは、この記事で解説した手法とは異なるものです。SilverlightでのJSONサポートについては、WINGSプロジェクト かるあ(杉山 洋一)氏の書かれた以下の記事などを参考にしてください。

