2012-03-18 5 views
1

新しいNSJSONSerializationクラスとNSPropertyListSerializationクラスを使用してJSONファイルをplistに変換しています。私は自分のJSONをPlistにエラーなく変換することができますが、私の最後のステップで、plistを私のデスクトップに書き込むと、プログラムはクラッシュしますが、Plistが生成された後です!NSData writeToFileはPlistを正常に書き込みますが、NSInvalidArgumentExceptionを返してクラッシュします。

NSData *data = [[NSData alloc] initWithContentsOfURL:path]; \\(NSURL *)path -->goes to my JSON file 
NSMutableDictionary *json = [NSJSONSerialization JSONObjectWithData:data 
                  options:NSJSONReadingMutableContainers 
                   error:nil]; 

//the following removes all key/object pairs where the object is null, because NSPropertyListSerialization with throw an error if there are null values 
for (id __strong object in [json objectForKey:@"terms"]) { 
     if ([object objectForKey:@"image"] == [NSNull null]) { 
      [object removeObjectForKey:@"image"]; 
     } 
    } 

//the following NSPropertyListSerialization method returns an NSData 
id plist = [NSPropertyListSerialization dataFromPropertyList:(id)json 
                 format:NSPropertyListXMLFormat_v1_0 
              errorDescription:nil]; 


NSError *writeToFileError; 
[plist writeToFile:@"/Users/kalaracey/Desktop/test.plist" 
     atomically:YES 
      encoding:NSUTF8StringEncoding 
      error:&writeToFileError]; 

次に、この最後の行では、NSInvalidArgumentExceptionがスローされ、私のプログラムがクラッシュしています。しかし、plistは正常に生成されました!私はそれを読むことができ、私のプログラムのクラッシュ以外はすべてうまくいっています。

誰かがこのクラッシュの原因を説明して、クラッシュを回避する方法を教えてください。

+0

例外: –

+0

例外は、最後のメソッドのための 'NSInvalidArgumentException'です。つまり、plist(と思われる)が' writeToFile:atomicallyencoding:error: 'に応答しません。 – kalaracey

答えて

2

この問題は、変数plistがタイプidであると思われます。 NSDataにキャストしてください。

NSData *plist = (NSData *) [NSPropertyListSerialization ...]; 

あなたは正しくコメントで指摘するように、NSDatawriteToFile:atomically:メソッドを使用する必要があります。

+1

実際に、私はそれを考え出した。 'NSData'は' writeToFile:atomically:encoding:error'に応答しません。これは 'NSDictionary'メソッドです。 'NSData'メソッドは' writeToFile:atomically: 'です。私はちょうどそれに答えている場合、私は質問を削除するはずですか? – kalaracey

+0

いいえ、上の目盛り(数字の下)をチェックしてください。私は他人の利益のために自分の答えを適応させます。 – Mundi

+0

しかし、私はそれが動作するためにplistの戻り値の型を変更する必要はありません。私がすべき理由はありますか?開発者のドキュメントでは、NSPropertyListSerializationによって返されるオブジェクトにidの型を与えるように指示しています。彼らはそれを明示的に言っていませんが、それはそのような例です。 – kalaracey

関連する問題