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 件のコメント:
コメントを投稿