Bagaimana saya bisa mengkonversi NSDictionary ke NSData dan sebaliknya?

158

Saya mengirim NSStringdan UIImagemenggunakan bluetooth. Saya memutuskan untuk menyimpan keduanya di a NSDictionarydan kemudian mengonversi kamus ke NSData.

Pertanyaan saya adalah bagaimana cara konversi NSDictionaryke NSDatadan sebaliknya?

Ali
sumber

Jawaban:

361

NSDictionary -> NSData:

NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myDictionary];

NSData -> NSDictionary:

NSDictionary *myDictionary = (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithData:myData];
Anh Nguyen
sumber
Untuk NSData -> NSDictionary, cast ke NSDictionary tampaknya tidak perlu.
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];

Anda bisa melakukannya dengan kelas apa pun yang sesuai dengan NSCoding.

sumber

LeonS
sumber
1
Bukan untuk mengambil apa pun dari jawaban ini, tetapi hanya kepala yang tidak sesuai dengan ARC
Madbreaks
10
Ya, jawaban saya adalah dari tahun 2011 di mana ARC tidak ada
LeonS
41

Gunakan NSJSONSerialisasi:

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

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

Pengembalian terbaru id, jadi ide yang bagus untuk memeriksa jenis objek yang dikembalikan setelah Anda casting (di sini saya menggunakan NSDictionary).

pengguna1244109
sumber
23

Di Swift 2 Anda dapat melakukannya dengan cara ini:

var dictionary: NSDictionary = ...

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

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

Dalam Swift 3 :

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

/* NSData to NSDictionary */
let unarchivedDictionary = NSKeyedUnarchiver.unarchiveObject(with: data)
Luca Davanzo
sumber
Tidak bekerja ! Kode setara Swift 3 tidak berfungsi. biarkan data = NSKeyedArchiver.archivedData (withRootObject: dataFromNetwork) [_SwiftValue encodeWithCoder:]: pemilih tidak dikenal dikirim ke contoh ...
mythicalcoder
Hargai respons cepat Anda. Yang saya maksud adalah ini - kode Swift 3 juga tidak berfungsi. Data saya berasal dari 3lvis / jaringan HTTP library, ini Any?bertipe. Tetapi itu menunjukkan kesalahan mengkonversi dari NSDictionaryke NSData. Jadi saya mencoba kode Anda. Tidak bekerja.
mitos pembuat
17

NSDictionary dari NSData

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

NSDictionary ke NSData

Anda dapat menggunakan kelas NSPropertyListSerialization untuk itu. Lihatlah metodenya:

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

Mengembalikan objek NSData yang berisi daftar properti yang diberikan dalam format yang ditentukan.

Jhaliya
sumber
Ini adalah solusi yang sangat elegan untuk sebagian besar pengembang Mac OS.
mjl007
0

Silakan coba yang ini

NSError *error;
NSDictionary *responseJson = [NSJSONSerialization JSONObjectWithData:webData
                                options:NSJSONReadingMutableContainers
                                error:&error];
Vijay Kachhadiya
sumber
Ini response, tidak responce. Saya mengoreksi ini untuk Anda.
Alex Zavatone