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

标签 ios swift cocoa-touch nsdata nsjsonserialization

以这个简化的例子为例:

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

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

我无法让它运行,它崩溃了:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (NSConcreteMutableData)'

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

最佳答案

值得您花时间通读 JSON RFC .注意:

JSON can represent four primitive types (strings, numbers, booleans, and null) and two structured types (objects and arrays).

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

关于ios - 当其中一个值是 NSData 时,如何使用 NSJSONSerialization 存储序列化 NSDictionary?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37978679/

相关文章:

ios - 新站推送和执行代码

ios - 使用 iphone 应用程序将文件从 dropbox/box 帐户上传到我的服务器

swift - 无法为值添加下标

string - 从 CLPlacemark 创建地址字符串

objective-c - 在没有\n的情况下在 UITextView 中显示段落

ios - 以编程方式获取 UIKeyboard 背景颜色

ios - Swift integerForKey : If the specified key does not exist, 这个方法返回0

ios - MailCore2 替代品

iphone - UIlabel - 将文本属性与另一个 NSString 链接

ios - NSUserDefaults setValue 和 objectForKey