2016-06-22 10 views
1

이 간단한 예를 보자값 중 하나가 NSData 일 때 NSJSONSerialization과 함께 NSDictionary를 직렬화 저장하는 방법은 무엇입니까?

let dict: [String: AnyObject] = ["foo": ("bar" as NSString).dataUsingEncoding(NSUTF8StringEncoding)!9] 

let json = try! NSJSONSerialization.dataWithJSONObject(dict, options: []) 

나는 그것과 충돌, 그 실행을 얻을 수 없습니다 : 'JSON 쓰기에 잘못된 유형 (: 인해 캐치되지 않는 예외'NSInvalidArgumentException '응용 프로그램 종료, 이유는

NSConcreteMutableData) '

일부 값은 문자열이고 일부는 NSData 인 JSON 블록을 내 서버로 보내야합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

2

JSON RFC을 읽는 것이 좋습니다. 참고 :

JSON은 네 개의 기본 유형 (문자열, 숫자, 부울 및 null)과 두 개의 구조화 된 유형 (객체 및 배열)을 나타낼 수 있습니다.

JSON은 원시 데이터를 나타낼 수 없으므로 NSData을 다른 유형 (일반적으로 문자열) 중 하나로 변환해야합니다. 한 가지 일반적인 접근 방식은 다음과 같습니다.

let stringFromData = NSString(data: data, encoding: NSUTF8StringEncoding) 

사용하려는 인코딩에 대해 사용자와 서버가 동의하는지 확인하십시오.

이러한 항목이 많은 경우 사전을 통해 매핑하고 한 번에 변환 할 수 있습니다. 구조에 따라 몇 가지 구현이 가능합니다.

let dictWithString = dict.map { (key, value) -> (String, NSObject) in 
    if let value = value as? NSData { 
     return (key, NSString(data: value, encoding: NSUTF8StringEncoding)!) 
    } 

    return (key, value) 
} 
0

json 콘텐츠로 설정하기 위해 NSData를 Base64 인코딩 된 문자열로 변환 할 수도 있습니다.

let base64String = rawData.base64EncodedStringWithOptions(.Encoding64CharacterLineLength) 

디코딩 :

let rawData = NSData(base64EncodedString: base64String, options: .IgnoreUnknownCharacters)