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?

Antworten:


361

NSDictionary -> NSData:

NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myDictionary];

NSData -> NSDictionary:

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

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


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


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)

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.


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

Es ist responsenicht responce. Ich habe das für dich korrigiert.
Alex Zavatone
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.