JSONライブラリのYAJLを使ってみる
Objective-CでJSONのデータを扱う場合にはJSON Frameworkを使うのが便利であるが、YAJLというライブラリもあると言うことで、こちらも試しに利用してみた。その使い方は以下。
[事前準備]
1. 必要なソースコードとライブラリの追加
GitHub - gabriel/yajl-objc: Objective-C bindings for YAJL (Yet Another JSON Library) C libraryからソースコードをダウンロードしてくるのだが、iPhone用のライブラリをダウンロードする(本日現在だとlibYAJLIPhone-0.2.13.zipというファイル)。そして、ダウンロードしたzipファイルを解凍し、中にあるヘッダファイルとライブラリを全てXCodeのプロジェクトに追加する。
2. プロジェクトの設定
ビルドの設定で「他のリンカフラグ」に-ObjCと-all_loadを追加する。
以上で準備は終わりである。
[利用方法]
例としてTwitterのつぶやきをJSON形式で取得してきてパースする場合を示す。
#import "NSObject+YAJL.h" - (void)getMyTweets { NSString *urlString = @"http://twitter.com/statuses/user_timeline/tomute.json"; NSURL *url = [NSURL URLWithString:urlString]; NSString *jsonString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil]; // YAJLを使ったJSONデータのパース処理 NSArray *jsonArray = [jsonString yajl_JSON]; // つぶやきとつぶやいた時刻をダンプ for (NSDictionary *dic in jsonArray) { NSLog(@"%@", [dic objectForKey:@"text"]); NSLog(@"%@", [dic objectForKey:@"created_at"]); } }
上記のようにJSON Frameworkとほぼ同じように利用できる(JSON Frameworkだとパース処理部分が以下のようになる)。
NSArray *jsonArray = [jsonString JSONValue];
なお「http://rel.me/2009/10/08/json-parsing-speed-test-yajl-vs-sbjson-iphone/」という記事によると、YAMLの方が60%ほどスピードが早いそうなのだが、試しに自分のiPhone 3Gを使って上記のつぶやきのパース速度を比較してみた。
YAJL | JSON Framework | |
---|---|---|
1回目 | 0.14sec | 0.24sec |
2回目 | 0.09sec | 0.17sec |
3回目 | 0.09sec | 0.17sec |
結果としては確かにYAJLの方が早いという感じだったので、JSONデータのパース処理がボトルネックになっているというような場合には、YAJLの使用を検討してみるというのも良いかも知れない。
[備考]
ビルド時に以下のようなワーニングが出ていたのだが原因は究明出来ず。
ld: warning: _YAJLParserErrorCode has different visibility (default) in /Users/tomute/Documents/iPhoneAppDev/Test/YAJLTest/libYAJLIPhone-0/libYAJLIPhone.a(YAJLDocument.o) and (hidden) in /Users/tomute/Documents/iPhoneAppDev/Test/YAJLTest/build/YAJLTest.build/Debug-iphonesimulator/YAJLTest.build/Objects-normal/i386/YAJLTestAppDelegate.o
[関連記事]