Jak mogę przekonwertować NSDictionary na NSData i odwrotnie?

158

Wysyłam NSStringi UIImageużywam bluetooth. Zdecydowałem się zapisać oba NSDictionarypliki w a, a następnie przekonwertować słownik na NSData.

Moje pytanie brzmi: jak przekonwertować NSDictionaryna NSDatai odwrotnie?

Ali
źródło

Odpowiedzi:

361

NSDictionary -> NSData:

NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myDictionary];

NSData -> NSDictionary:

NSDictionary *myDictionary = (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithData:myData];
Anh Nguyen
źródło
W przypadku NSData -> NSDictionary rzutowanie na NSDictionary wydaje się niepotrzebne.
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];

Możesz to zrobić z każdą klasą zgodną z NSCoding.

źródło

LeonS
źródło
1
Nie
chcę
10
Tak, moja odpowiedź pochodzi z 2011 roku, gdzie ARC nie istniało
LeonS
41

Użyj NSJSONSerialization:

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

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

Najnowsze wyniki id, więc dobrym pomysłem jest sprawdzenie zwróconego typu obiektu po przesłaniu (tutaj rzutowałem na NSDictionary).

user1244109
źródło
23

W Swift 2 możesz to zrobić w następujący sposób:

var dictionary: NSDictionary = ...

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

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

W Swift 3 :

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

/* NSData to NSDictionary */
let unarchivedDictionary = NSKeyedUnarchiver.unarchiveObject(with: data)
Luca Davanzo
źródło
Nie działał ! Odpowiednik kodu Swift 3 nie działał. let data = NSKeyedArchiver.archivedData (withRootObject: dataFromNetwork) [_SwiftValue encodeWithCoder:]: nierozpoznany selektor wysłany do instancji ...
mythicalcoder
Doceń twoją szybką odpowiedź. Miałem na myśli to - kod Swift 3 również nie działał. Moje dane pochodzą z biblioteki 3lvis / sieciowej HTTP, są to dane Any?typu. Ale pokazał błąd podczas konwersji z NSDictionaryna NSData. Więc wypróbowałem twój kod. To nie działało.
mythicalcoder
17

NSDictionary z NSData

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

NSDictionary do NSData

Możesz do tego użyć klasy NSPropertyListSerialization. Spójrz na jego metodę:

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

Zwraca obiekt NSData zawierający daną listę właściwości w określonym formacie.

Jhaliya
źródło
Jest to bardzo eleganckie rozwiązanie dla większości programistów Mac OS.
mjl007
0

Spróbuj tego

NSError *error;
NSDictionary *responseJson = [NSJSONSerialization JSONObjectWithData:webData
                                options:NSJSONReadingMutableContainers
                                error:&error];
Vijay Kachhadiya
źródło
To responsenie jest responce. Poprawiłem to dla ciebie.
Alex Zavatone