Como posso converter o NSDictionary em NSData e vice-versa?


158

Estou enviando NSStringe UIImageusando bluetooth. Decidi armazenar os dois em um NSDictionarye depois converter o dicionário para NSData.

Minha pergunta é como converter NSDictionarypara NSDatae vice-versa?

Respostas:


361

NSDictionary -> NSData:

NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myDictionary];

NSData -> NSDictionary:

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

Para NSData -> NSDictionary, a conversão para NSDictionary parece desnecessária.
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];

Você pode fazer isso com qualquer classe que esteja em conformidade com NSCoding.

fonte


1
Para não tirar nada de esta resposta, mas apenas a cabeças que não é compatível com ARC
Madbreaks

10
Sim, a minha resposta é a partir de 2011, onde ARC não existia
Leons

41

Use NSJSONSerialization:

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

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

Os retornos mais recentes id, portanto, é uma boa ideia verificar o tipo de objeto retornado após a transmissão (aqui eu converti para o NSDictionary).


23

No Swift 2, você pode fazer o seguinte:

var dictionary: NSDictionary = ...

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

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

No Swift 3 :

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

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

Não funcionou ! O código equivalente do Swift 3 não funcionou. deixe data = NSKeyedArchiver.archivedData (withRootObject: dataFromNetwork) [_SwiftValue encodeWithCoder:]: selector não reconhecido enviada à instância ...
mythicalcoder

Aprecie sua resposta rápida. O que eu quis dizer é isso - o código Swift 3 também não funcionou. Meus dados são da biblioteca HTTP 3lvis / networking, são do Any?tipo. Mas mostrou erro ao converter de NSDictionarypara NSData. Então, eu tentei seu código. Não funcionou.
Mythicalcoder #

17

NSDictionary from NSData

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

NSDictionary para NSData

Você pode usar a classe NSPropertyListSerialization para isso. Dê uma olhada em seu método:

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

Retorna um objeto NSData que contém uma determinada lista de propriedades em um formato especificado.


Esta é uma solução muito elegante para a maioria dos desenvolvedores de Mac OS.
Mjl007

0

Tente este, por favor

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

É response, não responce. Eu corrigi isso para você.
Alex Zavatone
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.