web-dev-qa-db-fra.com

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

J'envoie NSString et UIImage en utilisant Bluetooth. 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 en NSData et inversement?

155
Ali

NSDictionary -> NSData:

NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myDictionary];

NSData -> NSDictionary:

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

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.

source

51
LeonS

Utilisez NSJSONSerialization:

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

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

Le dernier retourne id, c'est donc une bonne idée de vérifier le type d'objet renvoyé après le transtypage (ici, j’ai transposé dans NSDictionary).

39
user1244109

Dans Swift 2 vous pouvez le faire de cette façon:

var dictionary: NSDictionary = ...

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

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

Dans Swift:

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

/* NSData to NSDictionary */
let unarchivedDictionary = NSKeyedUnarchiver.unarchiveObject(with: data)
21
Luca Davanzo

NSDictionary de NSData

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

NSDictionary à NSData

Vous pouvez utiliser la classe NSPropertyListSerialization pour cela. Regardez sa méthode:

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

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

17
Jhaliya

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

NSError *error;
NSDictionary *responseJson = [NSJSONSerialization JSONObjectWithData:webData
                                options:NSJSONReadingMutableContainers
                                error:&error];
0