読者です 読者をやめる 読者になる 読者になる

NSJSONSerialization で JSON 文字列をパースしてみた

objective-c ios

Web API が返す JSON をパースするライブラリの定番は JSONKit みたいだけど、iOS5 から標準で NSJSONSerialization っていうクラスが提供されているので、こちらを使うことにする。

まずは練習として JSON 文字列をパースして NSArray に変換してみた。

// JSON 文字列
NSString *jsonString = @"[{\"title\":\"RDocを記述する\", \"content\":\"RDocを記述する\"}, {\"title\":\"組み込んで使えるようにする\", \"content\":\"組み込んで使えるようにする\"}]";

// JSON 文字列をそのまま NSJSONSerialization に渡せないので、
// NSData に変換する
NSData *jsonData = [jsonString dataUsingEncoding:NSUnicodeStringEncoding];

// JSON を NSArray に変換する
NSError *error;
NSArray *array = [NSJSONSerialization JSONObjectWithData:jsonData
                                                 options:NSJSONReadingAllowFragments
                                                   error:&error];

// JSON のオブジェクトは NSDictionary に変換されている
NSMutableArray *results = [[NSMutableArray alloc] init];
for (NSDictionary *obj in array)
{
    Entry *entry = [[Entry alloc] init];
    entry.title = [obj objectForKey:@"title"];
    entry.content = [obj objectForKey:@"content"];
    [results addObject:entry];
}

今作っているアプリはビューアなので、JSON を NSArray や NSDictinary に変換できれば十分。

ちなみに、Entry はこのサンプル用に適当に定義したクラス。

@interface Entry : NSObject

@property (nonatomic) NSString *title;
@property (nonatomic) NSString *content;

@end

2014/02/15

  • サンプルコードの typo を修正
  • Entry の定義を追加