¿Cómo puedo convertir NSDictionary a NSData y viceversa?

158

Estoy enviando NSStringy UIImageusando bluetooth. Decidí almacenar ambos en NSDictionaryay luego convertir el diccionario a NSData.

Mi pregunta es cómo convertir NSDictionarya NSDatay viceversa?

Ali
fuente

Respuestas:

361

NSDictionary -> NSData:

NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myDictionary];

NSData -> NSDictionary:

NSDictionary *myDictionary = (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithData:myData];
Anh Nguyen
fuente
Para NSData -> NSDictionary, la conversión a NSDictionary parece innecesaria.
Pang
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];

Puede hacerlo con cualquier clase que se ajuste a NSCoding.

fuente

LeonS
fuente
1
No para quitarle nada a esta respuesta, pero solo una
advertencia de
10
Sí, mi respuesta es de 2011 donde ARC no existía
LeonS
41

Utilice la serialización NSJSONS:

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

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

Los últimos retornos id, por lo que es una buena idea verificar el tipo de objeto devuelto después de lanzar (aquí lancé a NSDictionary).

usuario1244109
fuente
23

En Swift 2 puedes hacerlo de esta manera:

var dictionary: NSDictionary = ...

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

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

En Swift 3 :

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

/* NSData to NSDictionary */
let unarchivedDictionary = NSKeyedUnarchiver.unarchiveObject(with: data)
Luca Davanzo
fuente
No funcionó ! El código equivalente a Swift 3 no funcionó. let data = NSKeyedArchiver.archivedData (withRootObject: dataFromNetwork) [_SwiftValue encodeWithCoder:]: selector no reconocido enviado a la instancia ...
mythicalcoder
Agradezco su rápida respuesta. Lo que quise decir es esto: el código Swift 3 tampoco funcionó. Mis datos provienen de la biblioteca HTTP 3lvis / networking, es de Any?tipo. Pero mostró un error al convertir de NSDictionarya NSData. Así que probé tu código. No funcionó.
mythicalcoder
17

NSDictionary de NSData

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

NSDictionary a NSData

Puede usar la clase NSPropertyListSerialization para eso. Echa un vistazo a su método:

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

Devuelve un objeto NSData que contiene una lista de propiedades dada en un formato especificado.

Jhaliya
fuente
Esta es una solución muy elegante para la mayoría de los desarrolladores de Mac OS.
mjl007
0

Por favor, pruebe este

NSError *error;
NSDictionary *responseJson = [NSJSONSerialization JSONObjectWithData:webData
                                options:NSJSONReadingMutableContainers
                                error:&error];
Vijay Kachhadiya
fuente
Es response, no responce. Lo corregí por ti.
Alex Zavatone