C# で WebAPI を呼び出して JSON の特定の値を出力させる

備忘録として、C# コンソールアプリで、WebAPI を呼び出し、レスポンスで得られた JSON の特定の値を取り出して出力する方法を記載します。

#使用する WebAPI
今回は例として、天気予報を教えてくれる API `OpenWeatherAPI` を使用します。これは以下サイトで Sign Up すると無料で使用でき東京の天気予報も出力できるのでいろいろ試したいときに便利です。
参考情報 : [OpenWeather](https://openweathermap.org/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/d1a3b72c-0fb2-c633-2270-151e97efe6d5.png)
この API でフリーで使用できるものの中に今の天気を出力できる API があります。以下の様なリクエストで天気情報を得ることが来ます。

```
http://api.openweathermap.org/data/2.5/forecast?q=Tokyo,jp&units=metric&APPID={Your API Key}
```

この API で得られる JSON は以下のような形になります。

```json
{
    "coord": {
        "lon": 139.69,
        "lat": 35.69
    },
    "weather": [
        {
            "id": 800,
            "main": "Clear",
            "description": "clear sky",
            "icon": "01n"
        }
    ],
    "base": "stations",
    "main": {
        "temp": 15.49,
        "feels_like": 10.92,
        "temp_min": 12.22,
        "temp_max": 17.78,
        "pressure": 1011,
        "humidity": 59
    },
    "visibility": 10000,
    "wind": {
        "speed": 5.7,
        "deg": 240
    },
    "clouds": {
        "all": 0
    },
    "dt": 1586359041,
    "sys": {
        "type": 1,
        "id": 8074,
        "country": "JP",
        "sunrise": 1586376987,
        "sunset": 1586423326
    },
    "timezone": 32400,
    "id": 1850144,
    "name": "Tokyo",
    "cod": 200
}
```
ではこの出力結果を C# で処理してみます。

#C# で JSON を取り扱う
特定の値を抜き出して文字列を作成し、Console に出力するサンプルコードは以下になります。

```csharp
using System;
using System.Linq;
using System.Threading.Tasks;
using System.IO;
using System.Net.Http;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using System.Net;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            String url = "http://api.openweathermap.org/data/2.5/weather?q=Tokyo,jp&units=metric&APPID={Your API Key}";
            WebRequest request = WebRequest.Create(url);
            Stream response_stream = request.GetResponse().GetResponseStream();
            StreamReader reader = new StreamReader(response_stream);
            var obj_from_json = JObject.Parse(reader.ReadToEnd());
            var forecast_sum = obj_from_json["weather"][0]["main"];
            var forecast_des = obj_from_json["weather"][0]["description"];
            var forecast_max_temp = obj_from_json["main"]["temp_max"];
            var forecast_min_temp = obj_from_json["main"]["temp_min"];
            var forecast_hum = obj_from_json["main"]["humidity"];
            var forecast_wind = obj_from_json["wind"]["speed"];

            string forecast_output = "Tokyo is " + forecast_sum + " now. Description is " + forecast_des + ". Max tempreture is " + forecast_max_temp
                + "℃. Min tempreture is " + forecast_min_temp + "℃. Humidity is " + forecast_hum + "%. Wind is " + forecast_wind + "m/s. Have a good day!";
            Console.WriteLine(forecast_output);

        }
    }
}

```
出力結果は以下になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/ee450deb-6c22-e7ca-6f3b-403ee1353d2a.png)
非常に単純なプログラムですが、JSON を扱いなれていないと以外と引っ掛かります。個人的な考えですが、WebAPI で 取得した JSON の特定の値を取り出す際は、まずは JSON 整形サイトで値のキーを確認するのが便利です。
例えば JSON 整形サイトは以下の様なものがあります。
参考情報 : [JSON Pretty Linter Ver3](https://lab.syncer.jp/Tool/JSON-Viewer/)
このサイトでは API で得られた JSON を読み込ませると、得られた値のキーを教えてくれます。例えば今回の API で得られた JSON を以下の様に貼り付けてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/2042a355-eeae-4566-0ea2-53226942a052.png)
すると、画面したの Viewer にキー付きの整形された JSON が出てきます。これは非常に便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/fdb06fed-3e28-9007-2f84-aebe42d006f3.png)
こういった JSON 整形 Website を使用すると、より分かりやすく JSON を扱うことができるのではないでしょうか。
以上、簡単な備忘録でした。