NSDictionary nasıl NSData ve tersi dönüştürebilirim?


158

Bluetooth gönderiyorum NSStringve UIImagekullanıyorum. Her ikisini de a'da saklamaya NSDictionaryve sonra sözlüğü dönüştürmeye karar verdim NSData.

Sorum dönüştürmek nasıl NSDictionaryüzere NSDatatersi ve?

Yanıtlar:


361

NSDictionary -> NSData:

NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myDictionary];

NSData -> NSDictionary:

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

NSData -> NSDictionary için, NSDictionary için yayın gereksiz görünüyor.
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];

Bunu NSCoding'e uyan herhangi bir sınıfla yapabilirsiniz.

kaynak


1
Bu cevaptan bir şey almak değil, sadece ARC uyumlu olmayan bir kafa
Madbreaks

10
Evet, cevabım ARC'nin bulunmadığı
2011'den

41

NSJSONSerialization kullanın:

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

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

En son döner id, bu yüzden döküm yaptıktan sonra döndürülen nesne türünü kontrol etmek için iyi bir fikir (burada NSDictionary için döküm).


23

In Swift 2 Bu şekilde yapabilirsiniz:

var dictionary: NSDictionary = ...

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

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

In Swift 3 :

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

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

İşe yaramadı ! Swift 3 eşdeğer kodu çalışmadı. let data = NSKeyedArchiver.archivedData (withRootObject: dataFromNetwork) [_SwiftValue encodeWithCoder:]: tanınmayan seçici örneğe gönderildi ...
mythicalcoder

Hızlı yanıtınızı takdir edin. Demek istediğim bu - Swift 3 kodu da işe yaramadı. Verilerim 3lvis / networking HTTP kütüphanesinden, Any?tiptedir. Ancak bu dönüştürme yanlış olduğunu göstermiştir NSDictionaryiçin NSData. Kodunuzu denedim. İşe yaramadı.
mythicalcoder

17

NSData'dan NSDictionary

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

NSData için NSData

Bunun için NSPropertyListSerialization sınıfını kullanabilirsiniz. Yöntemine bir göz atın:

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

Belirli bir biçimde belirli bir özellik listesini içeren bir NSData nesnesi döndürür.


Bu, çoğu Mac OS geliştiricisi için çok zarif bir çözümdür.
mjl007

0

Lütfen bunu deneyin

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

Öyle responsedeğil responce. Bunu senin için düzelttim.
Alex Zavatone
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.