NSDictionary를 NSData로 또는 그 반대로 변환하려면 어떻게해야합니까?


158

블루투스를 보내고 사용 NSString하고 UIImage있습니다. 나는 둘 다 저장 NSDictionary하고 사전을로 변환 하기로 결정했습니다 NSData.

내 질문 변환하는 방법입니다 NSDictionaryNSData비자 반대하고?

답변:


361

NSDictionary-> NSData :

NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myDictionary];

NSData-> NSDictionary :

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

NSData-> NSDictionary의 경우 NSDictionary로 캐스트하지 않아도됩니다.
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];

NSCoding을 준수하는 모든 클래스에서이를 수행 할 수 있습니다.

출처


1
이 답변에서 어떤 것도 빼앗지 말고 ARC와 호환되지 않는다는 사실 만 이해하십시오
Madbreaks

10
예, 제 답변은 ARC가 존재하지 않은 2011 년부터입니다
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)

작동하지 않았다 ! 스위프트 3 동등한 코드가 작동하지 않았습니다. let data = NSKeyedArchiver.archivedData (withRootObject : dataFromNetwork) [_SwiftValue encodeWithCoder :] : 인식 할 수없는 선택자가 인스턴스로 전송 됨 ...
mythicalcoder

빠른 답변 감사합니다. 내가 의미하는 것은 Swift 3 코드도 작동하지 않았습니다. 내 데이터는 3lvis / networking HTTP 라이브러리에서 왔으며 Any?유형입니다. 그러나에서 (으) NSDictionary로 변환하는 중에 오류가 발생 했습니다 NSData. 그래서 나는 당신의 코드를 시도했습니다. 그것은 작동하지 않았다.
신화

17

NSData에서 NSDictionary

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.