tech.guitarrapc.cóm

Technical updates

WeatherHacks を触ってみる

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

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

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

コードサンプル

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

4つ用意しました。

https://gist.github.com/guitarrapc/2975aa101efa13da0caa

WeatherHacks.cs

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

WeatherHacksClass.cs

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

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

あとは普通です。

WeatherHacksClass.ps1

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

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

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

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

WeatherHacksFunction.ps1

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

まとめ

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

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