C#で緊急地震速報を取得する

こんにちは。
4ヶ月ぶりの Qiita です。

#何をするか
緊急地震速報を自分で手に入れていじれたら便利じゃないですか？
なので取得する部分まで作ります。
新強震モニタから取得します。

#環境
Windows 10 1803 Pro for Workstations
Visual Studio 2017

#実際に書く
適当にプロジェクトを作成してください。今回はコンソールアプリケーションで作成していきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204925/aece82cf-7a76-0032-aade-d74c3aed84c5.png)
作成されました。
今回は`Main`メソッドに書いていきます。

##現在時刻を用意する
`Main`メソッドに追記します。

```cs:Program.cs
var dt = var dt = new DateTime(2016, 12, 28, 21, 39, 44); // サンプル時刻
var time = dt.ToString("yyyyMMddHHmmss"); // 2018/07/18 12:35:40 だったら 20180718123540 になる
```

##時刻をもとにURLを組み立てて取得する
`Program.cs` の一番最初の `using` 文が書かれている部分に

```cs:Program.cs
using System.Net.Http;
```

を追記してください。

時刻を用意した部分の下に追記します。

```cs:Program.cs
var url = $"http://www.kmoni.bosai.go.jp/new/webservice/hypo/eew/{time}.json";
var client = new HttpClient(); // HttpClient をインスタンス化
var json = client.GetStringAsync(url).Result; // GET リクエストをして JSON を取得する
```

ここまでのコードです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204925/6df096be-b7c0-3257-5c45-58c4bee2440d.png)

ここまでで緊急地震速報が記載された JSON を取得することができます。
試しにテストも兼ねて実行してみましょう。

```cs:Program.cs
Console.WriteLine(json);
```

を追記するとコマンドプロンプトに出力されます。

うまくできましたか？
標準状態だと `F5` キーでデバッグをすると一瞬コマンドプロンプトが表示されてすぐ消えてしまいます。（環境による）
`Ctrl` + `F5` で `デバッグ無しで実行` をすると消えずに表示されたままになります。

成功したら次に進みましょう。

##解析する
今回は `Json.Net` を使って解析します。
ソリューションエクスプローラー内のプロジェクトにある `参照` を右クリックして `NuGetパッケージの管理` をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204925/a3fec95d-9f40-5733-8d97-582e84995ca9.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/204925/9612d0c1-30ff-9af2-8be6-170ce75c5ca8.png)

[参照] をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204925/91d3d4ea-b970-197e-f833-79afaf30144d.png)

検索ボックスに `newtonsoft` と入力します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204925/995c592d-457a-bca7-29ec-39f023162f0c.png)

①をクリックして、②のインストールをクリックしてインストールします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204925/9900089f-4e07-ec40-17f3-674cdf64d924.png)

インストールが完了しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204925/ba072ddd-486e-7470-f440-05fb297157f2.png)

インストールが完了しましたら `Program.cs` に移動します。

解析に必要なクラスを作成します。
`Shift` + `Alt` + `C` で新しいクラスファイルを作成します。
ここでは `EEW.cs` とします。
下記のコードに置き換えてください。名前空間は適宜書き換えてください。

```cs:EEW.cs
namespace EEW
{
    public class EEW
    {
        public Result result { get; set; }
        public string report_time { get; set; }
        public string region_code { get; set; }
        public string request_time { get; set; }
        public string region_name { get; set; }
        public string longitude { get; set; }
        public bool is_cancel { get; set; }
        public string depth { get; set; }
        public string calcintensity { get; set; }
        public bool is_final { get; set; }
        public bool is_training { get; set; }
        public string latitude { get; set; }
        public string origin_time { get; set; }
        public Security security { get; set; }
        public string magunitude { get; set; }
        public string report_num { get; set; }
        public string request_hypo_type { get; set; }
        public string report_id { get; set; }
        public string alertflg { get; set; }
    }

    public class Result
    {
        public string status { get; set; }
        public string message { get; set; }
        public bool is_auth { get; set; }
    }

    public class Security
    {
        public string realm { get; set; }
        public string hash { get; set; }
    }
}
```

このファイルはこれで完成です。

`Program.cs` に移動します。

先程入力した

```cs:Program.cs
using System.Net.Http;
```

の下に

```cs:Program.cs
using Newtonsoft.Json;
```

を追記してください。

`Main`メソッドに下記のコードを追記してください。

```cs:Program.cs
var eew = JsonConvert.DeserializeObject<EEW>(json);
var 取得時刻 = eew.report_time;
var 震源 = eew.region_name;
var 緯度 = eew.latitude;
var 経度 = eew.longitude;
var キャンセルフラグ = eew.is_cancel;
var 深さ = eew.depth;
var 最大予想震度 = eew.calcintensity;
var 最終報フラグ = eew.is_final;
var 訓練フラグ = eew.is_training;
var 発生時刻 = eew.origin_time;
var マグニチュード = eew.magunitude;
var 電文番号 = eew.report_num;
var 電文ID = eew.report_id;
var 警報フラグ = eew.alertflg;
```

変数名は適宜書き換えてください。
各変数に各項目の値が代入されていますので、好きなように使うことができます。

```cs
using System;
using System.Net.Http;
using Newtonsoft.Json;

namespace EEW
{
    class Program
    {
        static void Main(string[] args)
        {
            var dt = new DateTime(2016, 12, 28, 21, 39, 44);
            var time = dt.ToString("yyyyMMddHHmmss");
            var url = $"http://www.kmoni.bosai.go.jp/new/webservice/hypo/eew/{time}.json";
            var client = new HttpClient();
            var json = client.GetStringAsync(url).Result;
            Console.WriteLine(json);

            var eew = JsonConvert.DeserializeObject<EEW>(json);
            var 取得時刻 = eew.report_time;
            var 震源 = eew.region_name;
            var 緯度 = eew.latitude;
            var 経度 = eew.longitude;
            var キャンセルフラグ = eew.is_cancel;
            var 深さ = eew.depth;
            var 最大予想震度 = eew.calcintensity;
            var 最終報フラグ = eew.is_final;
            var 訓練フラグ = eew.is_training;
            var 発生時刻 = eew.origin_time;
            var マグニチュード = eew.magunitude;
            var 電文番号 = eew.report_num;
            var 電文ID = eew.report_id;
            var 警報フラグ = eew.alertflg;
        }
    }

    public class EEW
    {
        public Result result { get; set; }
        public string report_time { get; set; }
        public string region_code { get; set; }
        public string request_time { get; set; }
        public string region_name { get; set; }
        public string longitude { get; set; }
        public bool is_cancel { get; set; }
        public string depth { get; set; }
        public string calcintensity { get; set; }
        public bool is_final { get; set; }
        public bool is_training { get; set; }
        public string latitude { get; set; }
        public string origin_time { get; set; }
        public Security security { get; set; }
        public string magunitude { get; set; }
        public string report_num { get; set; }
        public string request_hypo_type { get; set; }
        public string report_id { get; set; }
        public string alertflg { get; set; }
    }

    public class Result
    {
        public string status { get; set; }
        public string message { get; set; }
        public bool is_auth { get; set; }
    }

    public class Security
    {
        public string realm { get; set; }
        public string hash { get; set; }
    }
}
```
こちらが今回作成したプログラムです。
サンプルの都合上同一ファイル内にクラスが書いてありますが、どちらでも動くので好きな方で構いません。

#終わり
今更こんなコード上げても需要はないと思いますが、これから地震系のソフトを作りたいなと思っている方が最初に躓く部分だと思いますので、どこかの誰かの役に立てばいいなと思います。

質問、誤字脱字、間違い等ありましたらコメントにてご指摘をお願いいたします。