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


今回はWindowsPhoneです。

JSON.netを利用します。解析対象はFoursquareのexploreAPI。

レスポンスのJSONの内、Venueのみを抽出します。

結論から言うと、シリアライズした方が楽。

まずは結果を保存するvenue.cs

venue.cs
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; }
    }
}

そして、実際に解析を行うMyParser.cs

MyParser.cs
using System.Linq;
using Newtonsoft.Json.Linq;
using System.Diagnostics;

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);

            }

        }

    }
}

同じ事をAndroidのJsonObjectとかを使ってやろうとすると、
forやifの鬼ネストになるんだろうな。

そういう意味では、すっきりしていてLINQは好きです。

好きだけど、やっぱりパーツの再利用が上手くできないというか何というか。

その辺上手く書けるようになりたいものですね。