2012年9月7日金曜日

C# + LINQでJSONをパースする


foursquareの'explore'のレスポンスのJSONを、Linq To Jsonを使ってパースします。ちなみにWindowsPhone。

シリアライズすれば早いのに・・・とか言わない。

またパースにはJSON.netを使います。http://json.codeplex.com/

必要なのは、'venue'データだけなので、先に保存用のクラスを作っておきます。

namespace ConflimJsonParser
{
    public class Venue
    {
        public string name { get; set; }
        public string address { get; set; }
        public string crossStreet { get; set; }
        public string city { get; set; }
        public string state { get; set; }
        public string country { get; set; }
        public string cc { get; set; }
        public double lat { get; set; }
        public double lng { get; set; }
        public string id { get; set; }
    }
}



で、パースの部分。

ちなみに元のJSONは https://developer.foursquare.com/docs/explore#req=venues/explore%3Fll%3D40.7,-74 をみておいてください。

namespace ConflimJsonParser
{
    public class MyParser
    {
        private string json = "省略";
        public void parse()
        {
            var str = JObject.Parse(json).SelectToken("response.groups").ToString();
            var venues = JArray.Parse(str).SelectMany(groups => groups["items"])
                .Select(items => items["venue"]).Select(venue =>
                {
                    var location = venue["location"];
                    return new Venue()
                    {
                        name = (string)venue["name"],
                        id = (string)venue["id"],
                        address = (string)location["address"],
                        crossStreet = (string)location["crossStreet"],
                        city = (string)location["city"],
                        state = (string)location["state"],
                        country = (string)location["country"],
                        cc = (string)location["cc"],
                        lat = (double)location["lat"],
                        lng = (double)location["lng"],
                    };
                });

            foreach (var venue in venues)
            {
                Debug.WriteLine(venue.name);
            }

        }

    }
}


やってみて

LINQいいよLINQ。

まとまったデータが欲しいならシリアライズしろ。

データというか、モジュールの結合が密接になっているように思います。そのへんがオブジェクト指向じゃないってことかな。

実は今回のコードは今作っているアプリからの引用なんだが、どうもなぁ。

この部分は、IObservable<string>を引数に取るメソッド内で利用される。そのため、かなりコードが違うものになっているのだ。

そりゃあ、引数が違えば実装が変わってくるのは一緒だけどここまで違うの!? って思うくらいの違い。

なんか再利用性が低いなーみたいなことを思ってしまってます。俺のスキルが足りないだけと言われたらそれまでだけど。

とは言え、Rxを使えば非同期処理もすっきり書けたり、コードを追いかけるのも楽になったりといいことも多いわけで。

まあ、ゆっくりと勉強していきますね。

0 件のコメント:

コメントを投稿