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プロジェクト かるあ(杉山 洋一)氏の書かれた以下の記事などを参考にしてください。