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?

Jawaban:


361

NSDictionary -> NSData:

NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myDictionary];

NSData -> NSDictionary:

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

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


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


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)

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.


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

Ini response, tidak responce. Saya mengoreksi ini untuk Anda.
Alex Zavatone
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.