在
Swift 3中,具有可选值的数组的JSONSerialization失败.这在Swift 2中起作用(产生null作为预期的nil选项的JSON值).
斯威夫特2:
let a: [String!] = ["a","b","c"] let b: [String] = ["a","c"] let s: String! = "a" let c = ["a",s] NSJSONSerialization.isValidJSONObject(a) //true NSJSONSerialization.isValidJSONObject(b) //true NSJSONSerialization.isValidJSONObject(c) //true
斯威夫特3:
let a: [String?] = ["a",s] JSONSerialization.isValidJSONObject(a) //false JSONSerialization.isValidJSONObject(b) //true JSONSerialization.isValidJSONObject(c) //false
这是一个预期的更改吗?它似乎很容易出错,因为任何使用隐式类型构造的数组或字典现在可能对JSON无效(即使它们实际上不包含任何nil值).
另外,如何指定空值?
解决方法
更新:截至Swift 3.0.1 / Xcode 8.1 beta 2,可选项
自动桥接到NSNull实例,请参阅
自动桥接到NSNull实例,请参阅
> SE-0140 – Warn when Optional converts to Any,and bridge Optional As Its Payload Or NSNull
和Xcode 8.1测试版发行说明.
例:
let array: [String?] = [ "a",nil,"c"] let jsonData = try! JSONSerialization.data(withJSONObject: array) print(String(data: jsonData,encoding: .utf8)!) // ["a",null,"c"]
Swift 2和3.0的上一个答案:只有NSNull()被序列化为JSON null,而不是选项
(独立于Swift版本).
可以像这样转换一组选项:
let a: [String?] = ["a","c"] let b = a.map { $0 as Any? ?? NSNull() } print(b) // ["a",<null>,"c"] let d = try! JSONSerialization.data(withJSONObject: b) print(String(data: d,encoding: .utf8)!) // ["a","c"]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。