Comment puis-je convertir NSDictionary en NSData et vice versa?

158

J'envoie NSStringet j'utilise UIImageBluetooth. J'ai décidé de stocker les deux dans un NSDictionary, puis de convertir le dictionnaire en NSData.

Ma question est de savoir comment convertir NSDictionaryà NSDataet inversement?

Ali
la source

Réponses:

361

NSDictionary -> NSData:

NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myDictionary];

NSData -> NSDictionary:

NSDictionary *myDictionary = (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithData:myData];
Anh Nguyen
la source
Pour NSData -> NSDictionary, la conversion en NSDictionary semble inutile.
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];

Vous pouvez le faire avec n'importe quelle classe conforme à NSCoding.

la source

LéonS
la source
1
Ne rien enlever à cette réponse, mais juste une tête que ce n'est pas conforme à l'ARC
Madbreaks
10
Oui, ma réponse est de 2011 où l'ARC n'existait pas
LeonS
41

Utilisez NSJSONSerialization:

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

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

Les derniers retours id, c'est donc une bonne idée de vérifier le type d'objet retourné après le cast (ici, j'ai casté vers NSDictionary).

user1244109
la source
23

Dans Swift 2, vous pouvez le faire de cette manière:

var dictionary: NSDictionary = ...

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

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

Dans Swift 3 :

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

/* NSData to NSDictionary */
let unarchivedDictionary = NSKeyedUnarchiver.unarchiveObject(with: data)
Luca Davanzo
la source
N'a pas marché ! Le code équivalent Swift 3 ne fonctionnait pas. let data = NSKeyedArchiver.archivedData (withRootObject: dataFromNetwork) [_SwiftValue encodeWithCoder:]: sélecteur non reconnu envoyé à l'instance ...
mythicalcoder
Appréciez votre réponse rapide. Ce que je voulais dire, c'est que le code Swift 3 ne fonctionnait pas non plus. Mes données proviennent de la bibliothèque HTTP 3lvis / networking, elles sont de Any?type. Mais il a montré une erreur de conversion de NSDictionaryen NSData. Alors j'ai essayé votre code. Cela n'a pas fonctionné.
mythicalcoder
17

NSDictionary de NSData

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

NSDictionary à NSData

Vous pouvez utiliser la classe NSPropertyListSerialization pour cela. Jetez un œil à sa méthode:

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

Renvoie un objet NSData contenant une liste de propriétés donnée dans un format spécifié.

Jhaliya
la source
C'est une solution très élégante pour la plupart des développeurs Mac OS.
mjl007
0

S'il vous plaît, essayez celui-la

NSError *error;
NSDictionary *responseJson = [NSJSONSerialization JSONObjectWithData:webData
                                options:NSJSONReadingMutableContainers
                                error:&error];
Vijay Kachhadiya
la source
Ça ne l'est responsepas responce. J'ai corrigé cela pour vous.
Alex Zavatone