C# で JSON 形式のデータを取得

C# で JSON 形式のデータを取得することが VS2010 + .NET Framework 4.0 で非常に簡単に実現できるようになりました。System.Web.Extensions.dll で提供されている JavaScriptSerializer クラスを利用するのが便利です。
(※ System.Web.Extensions.dll は参照を追加する必要があります。)

郵便番号変換サービスを利用して、早速、試してみました。郵便番号の住所を JSON 形式で取得するオプションを指定して、HTTP GET で結果を文字列として受け取ります。それを YubinResponse0 というクラスに逆シリアライズするために JavaScriptSerializer クラスの Deserialize を呼ぶだけです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Script.Serialization;

namespace yubin7
{
    // http://www.northwind.mydns.jp/samples/webservice/getaddress/1230841/<option>/json/utf8
    // <option>
    // 0: [{"seq":1,"zip7":"123-0841","addr":"u6771u4eacu90fdu8db3u7acbu533au897fu65b0u4e95"}]
    // 2: [{"seq":1,"zip7":"123-0841","pref":"u6771u4eacu90fd","addr":"u8db3u7acbu533au897fu65b0u4e95"}]
    // 3: [{"seq":1,"zip7":"123-0841","pref":"u6771u4eacu90fd","city":"u8db3u7acbu533a","town":"u897fu65b0u4e95"}]
    //
    // See http://www.northwind.mydns.jp/samples/webservice/webapidoc.php for more info.

    public class YubinResponse0
    {
        public string seq { get; set; }
        public string zip7 { get; set; }
        public string addr { get; set; }
    }

    public class YubinResponse2
    {
        public string seq { get; set; }
        public string zip7 { get; set; }
        public string pref { get; set; }
        public string addr { get; set; }
    }

    public class YubinResponse3
    {
        public string seq { get; set; }
        public string zip7 { get; set; }
        public string pref { get; set; }
        public string city { get; set; }
        public string town { get; set; }
    }

    public class Yubin7
    {
        const string YUBIN_API = "http://www.northwind.mydns.jp/samples/webservice/getaddress/{0}/0/json/utf8";

        public Yubin7()
        {
        }

        public string getAddress(string yubinNo)
        {
            string uri = string.Format(YUBIN_API, yubinNo);
            string result = httpGet(uri, "");
            string addr = "";

            if (result != null && result.Length > 0)
            {

                try
                {
                    // JSON 形式データを変換
                    JavaScriptSerializer ser = new JavaScriptSerializer();
                    List<YubinResponse0> res0 = ser.Deserialize<List<YubinResponse0>>(result);

                    foreach (YubinResponse0 r in res0)
                    {
                        addr += r.addr + "\r\n";
                    }
                }
                catch (Exception e)
                {
                    System.Diagnostics.Debug.Print(e.ToString());
                }
            }

            return addr;
        }

        public bool chkYubinNo(string yubinNo)
        {
            return (System.Text.RegularExpressions.Regex.IsMatch(
                yubinNo,
                @"^\d{3}-\d{4}$",
                System.Text.RegularExpressions.RegexOptions.ECMAScript));
        }

        string httpGet(string URI, string Parameters)
        {
            string result = "";

            try
            {
                System.Net.WebRequest req = System.Net.WebRequest.Create(URI);
                req.Method = "GET";

                System.Net.WebResponse resp = req.GetResponse();

                if (resp == null)
                {
                    return "";
                }

                System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream());
                result = sr.ReadToEnd().Trim();
            }
            catch (Exception e)
            {
                System.Diagnostics.Debug.Print(e.ToString());
            }

            
            return result;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Console.WriteLine("郵便番号を入力して Enter キーを押下してください。");
                Console.WriteLine("終了するには、なにも入力しないで Enter キーを押下してください。");

                Console.Write("郵便番号: ");
                string sin = Console.ReadLine();

                Yubin7 yubin7 = new Yubin7();

                while (sin != null && sin.Length > 0)
                {
                    if (yubin7.chkYubinNo(sin))
                    {
                        sin = sin.Replace("-", "");

                        string result = yubin7.getAddress(sin);

                        if (result.Length > 0)
                        {
                            Console.WriteLine(result);
                        }
                        else
                        {
                            Console.WriteLine("該当なし");
                        }
                    }
                    else
                    {
                        Console.WriteLine("郵便番号は7桁で 123-4567 の形式で入力してください。");
                    }

                    Console.Write("郵便番号: ");
                    sin = Console.ReadLine();
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
    }
}

テキスト解析 – キーフレーズ抽出API

HTML コンテンツを取得して、キーワード抽出をしたいなと思って調べていたら、Yahoo Japan のディベロッパーネットワークにある「キーフレーズ抽出API」があったので試してみました。

詳細:
http://developer.yahoo.co.jp/webapi/jlp/keyphrase/v1/extract.html

使用するには、登録して APPID を取得する必要があります。

たとえば、下の文章をこのAPIに渡すと:

「郵便番号から住所を検索して jqGrid に表示し、選択した住所の地図を Google Maps で表示します。」

以下のキーフレーズを返してくれます:

Google Maps
jqGrid
住所
郵便番号
地図

何かに応用できるかも。