Come posso convertire NSDictionary in NSData e viceversa?


158

Sto inviando NSStringe UIImageutilizzando il bluetooth. Ho deciso di archiviare entrambi in un NSDictionarye quindi convertire il dizionario in NSData.

La mia domanda è come convertire NSDictionarya NSDatae viceversa?

Risposte:


361

NSDictionary -> NSData:

NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myDictionary];

NSData -> NSDictionary:

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

Per NSData -> NSDictionary, il cast su NSDictionary sembra non necessario.
Pang il

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

Puoi farlo con qualsiasi classe conforme a NSCoding.

fonte


1
Non togliere nulla da questa risposta, ma solo una testa che non è conforme ARC
Madbreaks

10
Sì, la mia risposta è del 2011 in cui ARC non esisteva
LeonS,

41

Usa NSJSONSerialization:

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

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

Gli ultimi ritorni id, quindi è una buona idea controllare il tipo di oggetto restituito dopo il cast (qui ho eseguito il cast su NSDictionary).


23

In Swift 2 puoi farlo in questo modo:

var dictionary: NSDictionary = ...

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

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

In Swift 3 :

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

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

Non ha funzionato ! Il codice equivalente di Swift 3 non funzionava. let data = NSKeyedArchiver.archivedData (withRootObject: dataFromNetwork) [_SwiftValue encodeWithCoder:]: selettore non riconosciuto inviato all'istanza ...
mythicalcoder

Apprezzo la tua risposta rapida. Quello che volevo dire è questo: anche il codice Swift 3 non funzionava. I miei dati provengono dalla libreria HTTP 3lvis / networking, sono di Any?tipo. Ma ha mostrato un errore durante la conversione da NSDictionarya NSData. Quindi ho provato il tuo codice. Non ha funzionato.
miticalcoder

17

NSDictionary da NSData

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

NSDictionary in NSData

È possibile utilizzare la classe NSPropertyListSerialization per questo. Dai un'occhiata al suo metodo:

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

Restituisce un oggetto NSData contenente un determinato elenco di proprietà in un formato specificato.


Questa è una soluzione molto elegante per la maggior parte degli sviluppatori Mac OS.
mjl007,

0

Provi questo, per favore

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

Non lo responseè responce. Ho corretto questo per te.
Alex Zavatone,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.