Ios 当其中一个值为NSData时,如何使用NSJSONSerialization存储序列化NSDictionary?

Ios 当其中一个值为NSData时,如何使用NSJSONSerialization存储序列化NSDictionary?,ios,swift,cocoa-touch,nsdata,nsjsonserialization,Ios,Swift,Cocoa Touch,Nsdata,Nsjsonserialization,以这个简化的例子为例: let dict: [String: AnyObject] = ["foo": ("bar" as NSString).dataUsingEncoding(NSUTF8StringEncoding)!9] let json = try! NSJSONSerialization.dataWithJSONObject(dict, options: []) 我无法运行它,它会崩溃: 由于未捕获异常“NSInvalidArgumentException”而终止应用程序,原因:

以这个简化的例子为例:

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

let json = try! NSJSONSerialization.dataWithJSONObject(dict, options: [])
我无法运行它,它会崩溃:

由于未捕获异常“NSInvalidArgumentException”而终止应用程序,原因:“JSON写入中的类型无效(nsConcreteModableData)”


我需要向我的服务器发送一个JSON块,其中一些值是字符串,一些值是
NSData
。我做错了什么?

值得你花时间通读这本书。注:

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)
}

您还可以将NSData转换为Base64编码字符串,以便设置为json内容

let base64String = rawData.base64EncodedStringWithOptions(.Encoding64CharacterLineLength)
和解码:

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