Як я можу конвертувати NSDictionary в NSData і навпаки?


158

Я надсилаю NSStringта UIImageвикористовую Bluetooth. Я вирішив зберігати і те, NSDictionaryі потім конвертувати словник у NSData.

Моє питання полягає в тому , щоб перетворити NSDictionaryв NSDataі навпаки?

Відповіді:


361

NSD Dictionary -> NSData:

NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myDictionary];

NSData -> NSD Dictionary:

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

Для NSData -> NSDictionary, передача NSDictionary здається непотрібною.
Панг

51

NSD Dictionary -> 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.

джерело



10
Так, моя відповідь з 2011 року, коли ARC не існувало
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

У Swift 2 ви можете це зробити таким чином:

var dictionary: NSDictionary = ...

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

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

У Swift 3 :

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

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

Не працює ! Еквівалентний код Swift 3 не працює. нехай дані = NSKeyedArchiver.archivedData (withRootObject: dataFromNetwork) [_SwiftValue encodeWithCoder:]: нерозпізнаний селектор, надісланий до інстанції ...
mythicalcoder

Вдячний за швидку відповідь. Що я мав на увазі, це так - код Swift 3 також не працював. Мої дані з 3lvis / мережевої бібліотеки HTTP, це Any?тип. Але це показало помилку при перетворенні NSDictionaryна NSData. Тому я спробував ваш код. Це не спрацювало.
mythicalcoder

17

NSDictionary від NSData

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.