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.