JSON Frameworkを使ってjsonをiPhone(iOS)でパースする。

iPhonejsonの解析はぐぐるとすぐに以下のページが出てくる。
[iPhone] JSON Framework の使い方(準備編) | Sun Limited Mt.
[iPhone] JSON Framework の使い方(解析編) | Sun Limited Mt.

ただ、これだと情報が古い。
現在のJSON Frameworkはバージョン2.3.1。
ちょっとやり方が変わっているから、メモ。
参考にしたのは以下のサイト
How to use JSON in Cocoa/Objective-C • Zach Waugh

JSON Frameworkは以下からダウンロードできる。
Google Code Archive - Long-term storage for Google Code Project Hosting.
Downloads · stig/json-framework · GitHub


ダウンロードしたら、解凍したフォルダ内のJSONをプロジェクトのクラス内にコピー。










JSON Frameworkを使うコード内に

#import "JSON.h"

を加える。

twitterのタイムラインをjsonで取ってきてパースするサンプルは以下。

// twitterからstatusesをダウンロードするためのURLリクエストを準備
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://twitter.com/statuses/public_timeline.json"]];

// URLからJSONデータを取得(NSData)
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

// JSONで解析するために、NSDataをNSStringに変換。
NSString *json_string = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];

// JSONデータをパースする。
// ここではJSONデータが配列としてパースされるので、NSArray型でデータ取得
NSArray *statuses = [json_string JSONValue];

// statuses内の要素を取り出して、確認
for (NSDictionary *status in statuses)
{
  // You can retrieve individual values using objectForKey on the status NSDictionary
  // This will print the tweet and username to the console
  NSLog(@"%@ - %@", [status objectForKey:@"text"], [[status objectForKey:@"user"] objectForKey:@"screen_name"]);
}

参考にしたサイトではSBJSON型のパース領域を用意しているが、これはObjectiv-Cのネイティブクラスであるため、iOSではサポートされてない様子。iOSでパースするために、

NSArray *statuses = [json_string JSONValue];

としている。

ここで、何も考えずに、NSDataをJSON Frameworkにパース用データとして与えたために少しはまってしまった。
確実にNSDataをNSStringに変換してからJSONにパースすること。