tech.guitarrapc.cóm

Technical updates

WeatherHacks を触ってみる

Twitter を眺めていると面白そうなのをみつけたので、自分ならどう書くか考えてました。

https://www.baku-dreameater.net/archives/8741#more-8741www.baku-dreameater.net

ただやるのでは楽しくないので、PowerShell との比較です。

目次

コードサンプル

素直だったので、てきとーにいきましょう。エラーハンドルはここではしていません。

4つ用意しました。

gist.github.com

WeatherHacks.cs

元との違いは HttpClient 使ってることぐらいです。サクッとデータ取るにはいいのです。

WeatherHacksClass.cs

JSON をいちいちパースするのがつらいので、普段はクラスとして一気にデシリアライズしています。

Visual Studio2013 以降は JSON String を貼り付けるときに、自動的にクラス変換する機能があります。そこで、適当に PowerShell や LINQPad で取得したJSONをクリップボードにコピーして、VS2015 で貼り付けるだけで クラスが生成できます。

あとは普通です。

WeatherHacksClass.ps1

PowerShell v5 の クラス構文で C# に近いコードの再現例です。

PowerShell では Invoke-RestMethod Cmdlet で超お手軽簡単にAPIを叩いてオブジェクトとして取得できます。が、そのままでは型が PSCustomObjectとなりとてもつらくなります。これはクラスに結果を突っ込めば解消できるので、C# で取得したクラスをちょちょいと持ってくるか、JSON String をクラスに自動変換する何かを書けばいいでしょう。

ちなみに PasteJSONasPowerShell はダメです。PSCustomObject にしちゃうのでこのケースでは意味を成しません。

ConvertToClass がいい感じでしょう。*1

WeatherHacksFunction.ps1

クラス構文がない PowerShell v4 では、C# クラスを Add-Type するか、妥協して PSCustomObject でどうぞ。

まとめ

API を一発叩くだけなら、PowerShell でもいいのですが、いかんせん非同期処理はコールバック地獄一直線なので、非同期処理するなら C# 一択です。

*1:Class 名が重複した場合の処理が入っていないのでIssueにあげてあります https://github.com/dfinke/ConvertToClass/issues/2