-
Notifications
You must be signed in to change notification settings - Fork 336
6.2 JSONのシリアライズとデシリアライズ
WebAPIやJSONRPCを利用する際、よくフォーマットとして利用されるのがJSONです。Foundation FrameworkにもJSONのシリアライズやデシリアライズを行うクラスが含まれています。この章ではそのクラスの利用法を説明します。
クラスリファレンスはこちら http://developer.apple.com/library/ios/#documentation/Foundation/Reference/NSJSONSerialization_Class/Reference/Reference.html
JSONのシリアライズ、デシリアライズを行うクラスはNSJSONSerializationです。このクラスを用いてNSData <--> JSONオブジェクトを変換するには以下の制約があります。
- トップレベルオブジェクトはNSArrayかNSDictionaryである
- 全てのオブジェクトは, NSString, NSNumber, NSArray, NSDictionary, NSNull いずれかのインスタンスである
- 全ての辞書のキーはNSString
- 数値はNaNや無限でない
変換することができるかを調べるメソッドとして+ (BOOL)isValidJSONObject:(id)obj
があります。
NSURLConnectionのレスポンスなどの結果をJSONオブジェクトに変換します。変換には
+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error
を用います。引数としてNSDataとオプション、NSErrorへのポインタを渡します。デシリアライズに失敗した時は戻り値がnilとなりerrorにその理由が含まれます。またオプションには以下の物があります
オプション | 説明 |
---|---|
NSJSONReadingMutableContainers | 利用するオブジェクトをNSMutableArray, NSMutabileDictionaryで変換します |
NSJSONReadingMutableLeaves | オブジェクトのキーとしてNSMutableStringを用います |
NSJSONReadingAllowFragments | JSONのトップレベルオブジェクトとしてDictionary, Array以外を指定できます。( "hoge" のような文字列のみでも変換できます) |
実行例
以下の文字列についてパースを行います。
{"employees":[{"lastName":"Doe","firstName":"John"},{"lastName":"Smith","firstName":"Anna"},{"lastName":"Jones","firstName":"Peter"}]}
変換コード
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
id obj = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"%@", obj);
出力結果
{
employees = (
{
firstName = John;
lastName = Doe;
},
{
firstName = Anna;
lastName = Smith;
},
{
firstName = Peter;
lastName = Jones;
}
);
}
JSONオブジェクトからNSDataへの変換には
+ (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error
を用います。基本的な使い方は上記の逆となります。JSONのトップレベルオブジェクトを引数として渡します。同時にオプションとエラーへのポインタを渡します。変換に成功したらUTF-8でエンコードされた文字列のNSDataが返されます。エラーがあったときはerrorにその内容が含まれます。
上記データを逆にNSDataに変換したサンプルは以下のようになります。
変換コード
NSData *data = [NSJSONSerialization dataWithJSONObject:obj options:0 error:nil];
NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
出力結果
{"employees":[{"lastName":"Doe","firstName":"John"},{"lastName":"Smith","firstName":"Anna"},{"lastName":"Jones","firstName":"Peter"}]}
またオプションとしてNSJSONWritingPrettyPrintedを渡すと改行やインデントを含めた文字列のNSDataがレスポンスになります。
{
"employees" : [
{
"lastName" : "Doe",
"firstName" : "John"
},
{
"lastName" : "Smith",
"firstName" : "Anna"
},
{
"lastName" : "Jones",
"firstName" : "Peter"
}
]
}
はじめに
-
導入
-
1.3 UIViewController1 UIViewController のカスタマイズ(xib, autoresizing)
-
UIKit 1 - container, rotate-
-
UIKit 2- UIView -
-
UIKit 3 - table view -
-
UIKit 4 - image and text -
-
ネットワーク処理
-
ローカルキャッシュと通知
-
Blocks, GCD
-
設計とデザインパターン
-
開発ツール
-
テスト
-
In-App Purchase
-
付録