Wie kann ich NSDictionary in NSData konvertieren und umgekehrt?

158

Ich sende NSStringund UIImagebenutze Bluetooth. Ich beschloss, beide in einem zu speichernNSDictionary und dann das Wörterbuch in zu konvertieren NSData.

Meine Frage ist , wie konvertieren NSDictionaryzu NSDataund umgekehrt?

Ali
quelle

Antworten:

361

NSDictionary -> NSData:

NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myDictionary];

NSData -> NSDictionary:

NSDictionary *myDictionary = (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithData:myData];
Anh Nguyen
quelle
Für NSData -> NSDictionary erscheint die Umwandlung in NSDictionary unnötig.
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];

Sie können dies mit jeder Klasse tun, die der NSCoding entspricht.

Quelle

LeonS
quelle
1
Um dieser Antwort nichts wegzunehmen, sondern nur einen
Hinweis darauf,
10
Ja, meine Antwort stammt aus dem Jahr 2011, als ARC nicht existierte
LeonS
41

Verwenden Sie NSJSONSerialization:

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

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

Die neuesten Renditen id , daher ist es eine gute Idee, den zurückgegebenen Objekttyp nach dem Casting zu überprüfen (hier habe ich ihn in NSDictionary umgewandelt).

user1244109
quelle
23

In Swift 2 können Sie dies folgendermaßen tun:

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)
Luca Davanzo
quelle
Funktioniert nicht ! Der entsprechende Swift 3-Code funktionierte nicht. let data = NSKeyedArchiver.archivedData (withRootObject: dataFromNetwork) [_SwiftValue encodeWithCoder:]: nicht erkannter Selektor an Instanz gesendet ...
mythicalcoder
Schätzen Sie Ihre schnelle Antwort. Was ich damit gemeint habe ist Folgendes - Swift 3 Code hat auch nicht funktioniert. Meine Daten stammen aus der 3lvis / Networking HTTP-Bibliothek und sind vom Any?Typ. Es wurde jedoch ein Fehler beim Konvertieren von NSDictionarynach angezeigt NSData. Also habe ich deinen Code ausprobiert. Es hat nicht funktioniert.
mythicalcoder
17

NSDictionary von NSData

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

NSDictionary zu NSData

Sie können dafür die NSPropertyListSerialization-Klasse verwenden. Schauen Sie sich die Methode an:

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

Gibt ein NSData-Objekt zurück, das eine bestimmte Eigenschaftsliste in einem angegebenen Format enthält.

Jhaliya
quelle
Dies ist eine sehr elegante Lösung für die meisten Mac OS-Entwickler.
mjl007
0

Probieren Sie mal das hier an

NSError *error;
NSDictionary *responseJson = [NSJSONSerialization JSONObjectWithData:webData
                                options:NSJSONReadingMutableContainers
                                error:&error];
Vijay Kachhadiya
quelle
Es ist responsenicht responce. Ich habe das für dich korrigiert.
Alex Zavatone