¿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?

Respuestas:


361

NSDictionary -> NSData:

NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myDictionary];

NSData -> NSDictionary:

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

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


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).


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)

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.


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];

Es response, no responce. Lo corregí por ti.
Alex Zavatone
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.