Как я могу преобразовать NSDictionary в NSData и наоборот?


158

Я отправляю NSStringи UIImageиспользую Bluetooth. Я решил сохранить оба в NSDictionaryи затем преобразовать словарь в NSData.

Мой вопрос, как конвертировать NSDictionaryв NSDataи наоборот?

Ответы:


361

NSDictionary -> NSData:

NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myDictionary];

NSData -> NSDictionary:

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

Для NSData -> NSDictionary приведение к NSDictionary кажется ненужным.
Пан

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
Не отнимать ничего от этого ответа, а лишь
намеки

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 эквивалентный код не работает. let data = NSKeyedArchiver.archivedData (withRootObject: dataFromNetwork) [_SwiftValue encodeWithCoder:]: нераспознанный селектор, отправленный экземпляру ...
mythicalcoder

Ценю ваш быстрый ответ. Я имел в виду следующее: код Swift 3 также не работал. Мои данные взяты из 3lvis / сетевой библиотеки HTTP, они имеют Any?тип. Но он показал ошибку при конвертации из NSDictionaryв NSData. Итак, я попробовал твой код. Это не работает.
Мифический

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.