東京電力 節電効果計測サイトは電力使用量データを外部から取得しているのですが、今までデータを提供していたサイトから前年データが取得できなくなってしまったため(原因は東京電力が公開しているグラフの画像データを勝手に変えたためですが)、別のサイトからデータを取得することにしました。
今まで取得していたデータはXML形式だったのでLinq To XMLであっさりと解体して扱えていたのですが、新しく取得するデータはJSON形式です。JSON形式については細かく触れませんが、以下のような形式のデータです、
{“name”: “John Smith”, “age”: 33}
今回あつかうデータは以下のような繰り返し形式のデータになります。
{“blackout”:false,”date”:”2011-03-27 20:00:00″,”lastyear”:4070,”used”:3345,”yesterday”:3432},
{“blackout”:false,”date”:”2011-03-27 19:00:00″,”lastyear”:4143,”used”:3392,”yesterday”:3462}
.NET Framewrokの標準ライブラリではJSON形式のデータを扱えないので、力づくで文字列操作をしてもいいのですがそれではスマートではありません。サードパーティ製のライブラリをさがすことにします。「DynamicJson」というライブラリがCodePlexで公開されていました、サンプルソースを見ると非常にスマートにシンプルにJSON形式のデータを扱うことができそうです。
ただし、C#4.0のdynamic型を使用しなければならないため、VBから使えないのです。(ミニマムコードで確認しました。・゚・(つД`)・゚・ )まぁ、泣いていても何も前に進まないので、ライブラリを使用する準備をします。
- 黙ってCodePlexからダウンロード
- 黙々と解凍
- ソリューション、プロジェクトを作成(必ず言語をC#にすること!)
- 「DynamicJson.dll」を参照設定
- using Codeplex.Data; をソースの先頭に記述
以上で準備は完了です。実際に、JSON形式のデータを取得し、解体するコードは以下のようになります。
var Wc = new WebClient();
string APIReturnValue = Wc.DownloadString(@”http://tepco-forecast.appspot.com/get_data?from=2011-03-27 00:00:00”);
dynamic JsonValue = DynamicJson.Parse(APIReturnValue);
foreach (var UsageData in JsonValue)
{
var blackout = UsageData.blackout;
var date = UsageData.date;
var lastyear = UsageData.lastyear;
var used = UsageData.used;
var yesterday = UsageData.yesterday;
}
ポイントは以下です。
- 素のJSON形式データは、WebClient.DownloadStringで取得する
- 取得したJSON形式データをDynamicJson.Parseの引数に渡し、dynamic型で受け取る
- データが繰り返し形式の場合は、foreachステートメントで列挙可能
- JSON形式のキー値をプロパティとしてデータを取得する
注意点はデータ型がdynamic型なので、どんなデータ型と判断されるのかわからないことです。実際”lastyear”はstringかintになるだろうと思っていたら、double型になっていました。そのため、データを受け取る変数をvarで宣言せずに型を明示的に宣言したほうがいいです、また、変数に代入する際にキャストを適切に行うべきです。
今回のエントリーは以上です。JSON形式のデータがLinqToXMLよりもはるかに簡単に扱えたことにびっくりです。また、今回のエントリー作成に参考にさせていただいたサイトは、以下の通りです。本当にいろいろな情報をブログで公開されている方に感謝感謝です。