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?

Réponses:


361

NSDictionary -> NSData:

NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myDictionary];

NSData -> NSDictionary:

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

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


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


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)

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


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

Ça ne l'est responsepas responce. J'ai corrigé cela pour vous.
Alex Zavatone
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.