iOSでjson

最近, “Professional iOS Network Programming”という本(英語)を見つけたので読んでいるところです。
その中で, jsonの話題があったので, サンプルでも書いておくことにしました。
json はネットワーク周りでよく利用しますね。jsonをダウロードしてデータとして保存しておくときなんかでしょうか?

iOSでjsonを扱うには,  NSJSONSerialization というのがあります。JSONObjectWithData というメソッドで,

NSDataをNSArrayや, NSDictionaryなどに変換できます。

 

返り値はidで, NSArray, NSDictionaryもしくはMutable系となります。Arrayか, Dictionaryかはjsonの形で決まるようです。
NSDataを引数として取るので, NSString の場合は変換の必要があります。
オプションとして, NSJSONReadingMutableContainers, NSJSONReadingMutableLeaves, NSJSONReadingAllowFragments 後ろの二つがどのような場面で利用できるかいまいちわかっていないです。

iOS Developer Libraryに説明がでています。

ではサンプル。

サンプル(NSString -> json Object -> NSArray, NSDictionary)

NSString *str = @"[{\"key\":\"value\"}]";
NSError *error = nil;
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
NSMutableArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
NSLog(@"%@", array);
NSLog(@"%@", [array objectAtIndex:0]);

これは, シンプルなケースです。NSArrayが返ってきています。
もう少し複雑なものを見てみましょう。

NSString *str2 = @"{\"name\":\"Homuhomu\", \"age\":14}";
NSData *data2 = [str2 dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data2 options:NSJSONReadingMutableContainers error:&error];
NSLog(@"%@", dic);
NSLog(@"%@", [dic objectForKey:@"name"]);  // You can get "Homuhomu"

この場合, NSDictonaryとしてデータを扱えます。

このように, NSArray, NSMutableArray, NSDictionary, NSMutableDictionary として扱えるので,
大変便利です。

サンプル(NSDictionary -> json -> NSData)

// dict to json(NSData)
NSMutableDictionary *mdic = [[NSMutableDictionary alloc] init];
[mdic setObject:@"madoka" forKey:@"name"];
[mdic setObject:[NSNumber numberWithInt:14] forKey:@"age"];
    
if([NSJSONSerialization isValidJSONObject:mdic]){
    NSData *json = [NSJSONSerialization dataWithJSONObject:mdic    options:NSJSONWritingPrettyPrinted error:&error];        
    NSLog(@"json %@", [[NSString alloc] initWithData:json encoding:NSUTF8StringEncoding] );
       
}
// Result
// json {
//  "age" : 14,
//  "name" : "madoka"
//}

NSJSONSerializationのdataWithJSONObjectを使って, NSMutableDictionaryを
jsonにそして, NSDataにしてNSStringで表示させています。isValidJSONObject
使うと, 正しい形式かどうかをチェックできます。