SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

.NET FrameworkでJSONデータを処理する

DataContractJsonSerializerとDynamicJsonの使用方法

  • X ポスト
  • このエントリーをはてなブックマークに追加

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データになります。

郵便番号検索結果の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データは、以下のような構造をしています。データ内に配列が含まれるなど、先ほどサンプルで扱ったものよりも格段に複雑なデータであることが分かります。

郵便番号検索結果のデータ構造
郵便番号検索結果のデータ構造

 各データ項目は以下のようなデータを表しています。

表2 郵便番号検索結果のデータの意味
キー 意味
query 検索文字列
totalResults 検索でヒットしたデータの件数
itemsPerPage このJSONデータに含まれるデータの件数
next 次の検索結果のURL
result 検索結果データの配列
zipcode 郵便番号
address 住所
link 詳細情報のURL

 今回は検索結果のzipcodeとaddressを抜き出し、郵便番号検索結果を一覧表示することにします。実際のコードは以下のようになります。

郵便番号検索サンプルコード(Program.cs)
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のメリットが際立ちます。それぞれの方法の特性を理解し、活用していきましょう。

SilverlightでのJSON処理について

 本文では、.NET FrameworkでのJSON処理について扱いましたが、Webサービスとの連携が多いSilverlightは、バージョン2からJSONをサポートしています。このJSONサポートは、この記事で解説した手法とは異なるものです。SilverlightでのJSONサポートについては、WINGSプロジェクト かるあ(杉山 洋一)氏の書かれた以下の記事などを参考にしてください。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 土井 毅(ドイ ツヨシ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5868 2011/04/21 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング