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

ほげほげ

プログラミング、英会話、ヨガ、料理などの備忘録など。

AFNetworkingで取得したJSONをローカルに保存するときに失敗する

特にAFNetworkingと直接関係あるわけではないのですが。。。

現象

AFNetworkingで取得したjsonのデータをキャッシュ的な役割で、ローカルに保存しようと、
writeToFileを使ったところ、戻り値がNOで保存できなかった。

原因

保存しようとしたJSONにnullが含まれていた。
そのnullはNSDictionaryに展開されるときに、NSNullになる。
NSDictionaryのwriteToFileでnullは保存できない。

だいたい、こんな感じです。

対応

今回は、取得したJSONのNSDictionaryをJSON文字列としてシリアライズしてから、NSDataを経由してファイルに保存しました。

コード

ダメなコード
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:@"あなたの好きなURL"
  parameters:nil
     success:^(AFHTTPRequestOperation *operation, id responseObject) {
         NSString *cacheFile = [DataManager cacheFilePath] ;
         if([responseObject writeToFile:cacheFile atomically:YES]){
             NSLog(@"キャッシュの保存に成功") ;
         } else {
             NSLog(@"キャッシュの保存に失敗") ;
         }
     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];
とりあえず、やりたいことができたコード
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:@"あなたの好きなURL"
  parameters:nil
     success:^(AFHTTPRequestOperation *operation, id responseObject) {
         NSString *cacheFile = [DataManager cacheFilePath] ;
         if ([NSJSONSerialization isValidJSONObject:responseObject]){
             NSLog(@"正しいJSONと判定") ;

             // シリアライズ
             NSData *data = [NSJSONSerialization dataWithJSONObject:responseObject
                                                            options:NSJSONWritingPrettyPrinted error:nil] ;

             // 保存
             if([data writeToFile:cacheFile atomically:YES]){
                 NSLog(@"キャッシュの保存に成功") ;
             } else {
                 NSLog(@"キャッシュの保存に失敗") ;
             }
         } else {
             NSLog(@"正常にJSONシリアライズできないオブジェクトと判断された") ;
         }
     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];