中堅プログラマーの備忘録

忘れっぽくなってきたので備忘録として・・・

【C#.net】Jsonファイルから任意の文字列でkeyを指定しvalueを取得する

1.概要

無料でありWeb APIから情報が取得できるサービスが非常にたくさん存在しています。
非常に便利でお世話になることも多いのではないでしょうか?
但し、無料であるが故、いつサービスが終了するのかと・・・
この問題はついて回ってきます。


そんな時にサービスを変更しても
柔軟に対応できる関数があると非常に便利です。


今回はグローバルIPを取得するサービスを使ってみます。


Web APIをたたくとレスポンスフォーマットがjsonであることが多いかと思いますが
各サービスごとにkeyが異なったりでなかなか汎用化が難しかったので
これに対応する関数を作成してみようかと思います。

2.Jsonファイルを扱う

Jsonファイルを扱う方法はたくさんあるかと思いますが
今回は【Newtonsoft.Json】を使います。

詳しい使い方は下記の記事を参照して下さい。
www.chuken-engineer.com

3.やりたいこと

2つのサイトからグローバルIPを取得しようかと思います。
取得出来る情報は下記のとおりで
サービスごとにkeyが異なります。
これを同じ関数を使って必要な情報を取得します。
下記の例でいえば
【query】【origin】
と異なるkeyから同じ値を取得します。

http://ip-api.com/json/

{
  "status": "success",
  "country": "Japan",
  "countryCode": "JP",
  "region": "**",
  "regionName": "****",
  "city": "****",
  "zip": "*********",
  "lat": **.****,
  "lon": ***.****,
  "timezone": "Asia/Tokyo",
  "isp": "*******",
  "org": "*********",
  "as": "*************",
  "query": "***.***.***.***"
}


http://httpbin.org/ip

{
  "origin": "***.***.***.***"
}

4.スクリプト

Formロード時にサイトにアクセスしてグローバルIPを取得します。
取得したデータはTextBoxに表示します。

using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.Windows.Forms;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace grobalIPcheck
{
    public partial class Form1 : Form
    {
        string u = "http://ip-api.com/json/";
        string k = "query";

        //string u = "http://httpbin.org/ip";
        //string k = "origin";

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            var task = Task.Run(() =>
            {
                return GetIPaddress(u, k);
            });
            textBox1.Text = task.Result;
        }

        private async Task<string> GetIPaddress(string url, string key)
        {
            HttpClient client = new HttpClient();
            // タイムアウト時間の設定(5秒)
            client.Timeout = TimeSpan.FromMilliseconds(5000);
            // 以下処理
            var response = await client.GetAsync(url);
            var resString = await response.Content.ReadAsStringAsync();
            JObject deserial = (JObject)JsonConvert.DeserializeObject(resString);
            return deserial[key].ToString();
        }
    }
}