NSDictionaryをNSDataに、またはその逆に変換するにはどうすればよいですか?


158

Bluetoothを送信NSStringしてUIImage使用しています。両方にを保存してNSDictionaryから、辞書をに変換することにしましたNSData

私の質問は、変換する方法であるNSDictionaryNSDataその逆と?

回答:


361

NSDictionary-> NSData:

NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myDictionary];

NSData-> NSDictionary:

NSDictionary *myDictionary = (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithData:myData];

NSData-> NSDictionaryの場合、NSDictionaryへのキャストは不要のようです。
2015

51

NSDictionary-> NSData:

NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:yourDictionary forKey:@"Some Key Value"];
[archiver finishEncoding];
[archiver release];

// Here, data holds the serialized version of your dictionary
// do what you need to do with it before you:
[data release];

NSData-> NSDictionary

NSData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
NSDictionary *myDictionary = [[unarchiver decodeObjectForKey:@"Some Key Value"] retain];
[unarchiver finishDecoding];
[unarchiver release];
[data release];

NSCodingに準拠する任意のクラスでそれを行うことができます。

ソース


1
この答えから何かを奪うのではなく、ARCに準拠していないことを示すだけです
Madbreaks 14

10
はい、私の答えはARCが存在しなかった2011年からです
LeonS

41

NSJSONSerializationを使用します。

NSDictionary *dict;
NSData *dataFromDict = [NSJSONSerialization dataWithJSONObject:dict
                                                       options:NSJSONWritingPrettyPrinted
                                                         error:&error];

NSDictionary *dictFromData = [NSJSONSerialization JSONObjectWithData:dataFromDict
                                                             options:NSJSONReadingAllowFragments
                                                               error:&error];

最新のが返されるidので、キャスト後に返されたオブジェクトタイプを確認することをお勧めします(ここではNSDictionaryにキャストしています)。


23

スウィフト2あなたはこの方法でそれを行うことができます。

var dictionary: NSDictionary = ...

/* NSDictionary to NSData */
let data = NSKeyedArchiver.archivedDataWithRootObject(dictionary)

/* NSData to NSDictionary */
let unarchivedDictionary = NSKeyedUnarchiver.unarchiveObjectWithData(data!) as! NSDictionary

スウィフト3

/* NSDictionary to NSData */
let data = NSKeyedArchiver.archivedData(withRootObject: dictionary)

/* NSData to NSDictionary */
let unarchivedDictionary = NSKeyedUnarchiver.unarchiveObject(with: data)

動作しませんでした !Swift 3の同等のコードが機能しませんでした。let data = NSKeyedArchiver.archivedData(withRootObject:dataFromNetwork)[_SwiftValue encodeWithCoder:]:認識されないセレクターがインスタンスに送信されました...
mythicalcoder

迅速な対応に感謝します。私が言ったことはこれです-Swift 3コードも機能しませんでした。私のデータは3lvis / networking HTTPライブラリからのもので、Any?タイプです。しかし、からNSDictionaryへの変換中にエラーが発生しましたNSData。だから私はあなたのコードを試してみました。うまく行かなかった。
mythicalcoder

17

NSDataのNSDictionary

http://www.cocoanetics.com/2009/09/nsdictionary-from-nsdata/

NSDictionaryからNSData

そのためにNSPropertyListSerializationクラスを使用できます。その方法を見てください:

+ (NSData *)dataFromPropertyList:(id)plist format:(NSPropertyListFormat)format
                              errorDescription:(NSString **)errorString

指定されたプロパティリストを指定された形式で含むNSDataオブジェクトを返します。


これは、ほとんどのMac OS開発者にとって非常に洗練されたソリューションです。
mjl007 2018年

0

これをお試し下さい

NSError *error;
NSDictionary *responseJson = [NSJSONSerialization JSONObjectWithData:webData
                                options:NSJSONReadingMutableContainers
                                error:&error];

それはresponse、ではありませんresponce。これを修正しました。
Alex Zavatone 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.