ฉันจะแปลง NSDictionary เป็น NSData และในทางกลับกันได้อย่างไร


158

ฉันกำลังส่งNSStringและUIImageใช้บลูทู ธ ฉันตัดสินใจที่จะเก็บทั้งในและแล้วแปลงพจนานุกรมNSDictionaryNSData

คำถามของฉันคือวิธีการแปลงNSDictionaryเป็นNSDataและวีซ่าในทางกลับกัน?

คำตอบ:


361

NSDictionary -> NSData:

NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myDictionary];

NSData -> NSDictionary:

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

สำหรับ NSData -> NSDictionary, การส่งไปยัง NSDictionary ดูเหมือนไม่จำเป็น
ปาง

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

คุณสามารถทำได้กับคลาสใด ๆ ที่สอดคล้องกับ NSCoding

แหล่ง


1
ที่จะไม่เอาอะไรออกไปจากคำตอบนี้ แต่เพียงหัวที่มันไม่ได้เป็นไปตามมาตรฐาน ARC
Madbreaks

10
ใช่คำตอบของฉันคือจากปี 2011 ที่ไม่มี ARC
LeonS

41

ใช้ NSJSONSerialization:

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

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

ผลตอบแทนล่าสุดidดังนั้นจึงเป็นความคิดที่ดีที่จะตรวจสอบชนิดของวัตถุที่ถูกส่งคืนหลังจากที่คุณร่าย (ที่นี่ฉันส่งไปที่ NSDictionary)


23

ในSwift 2คุณสามารถทำได้ด้วยวิธีนี้:

var dictionary: NSDictionary = ...

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

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

ในสวิฟต์ 3 :

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

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

ไม่ทำงาน ! โค้ดเทียบเท่า Swift 3 ไม่ทำงาน ให้ data = NSKeyedArchiver.archivedData (withRootObject: dataFromNetwork) [_SwiftValue encodeWithCoder:]: ตัวเลือกที่ไม่รู้จักถูกส่งไปยังอินสแตนซ์ ...
mythicalcoder

ขอบคุณคำตอบด่วนของคุณ สิ่งที่ฉันหมายถึงคือ - รหัส Swift 3 ไม่ทำงานเช่นกัน ข้อมูลของฉันมาจากไลบรารี HTTP 3lvis / networking ซึ่งเป็นAny?ประเภท แต่มันก็แสดงให้เห็นข้อผิดพลาดการแปลงจากไปNSDictionary NSDataดังนั้นฉันจึงลองใช้รหัสของคุณ มันไม่ได้ผล.
mythicalcoder

17

NSDictionary จาก NSData

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

NSDictionary เพื่อ NSData

คุณสามารถใช้คลาส NSPropertyListSerialization ดูวิธีการ:

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

ส่งคืนวัตถุ NSData ที่มีรายการคุณสมบัติที่กำหนดในรูปแบบที่ระบุ


นี่เป็นโซลูชันที่หรูหรามากสำหรับนักพัฒนา Mac OS ส่วนใหญ่
mjl007

0

โปรดลองอันนี้

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

มันไม่ได้response responceฉันแก้ไขให้คุณแล้ว
Alex Zavatone
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.