在Swift 3中,JSONSerialization具有可选值的数组失败.这在Swift 2中起作用(产生null作为nil期望的可选项的JSON值).
编辑:它没有,但留在这里,因为这是我提出问题时的错误信念.
斯威夫特2:
let a: [String!] = ["a","b","c"]
let b: [String] = ["a","b","c"]
let s: String! = "a"
let c = ["a",s]
NSJSONSerialization.isValidJSONObject(a) //true
NSJSONSerialization.isValidJSONObject(b) //true
NSJSONSerialization.isValidJSONObject(c) //true
Run Code Online (Sandbox Code Playgroud)
斯威夫特3:
let a: [String?] = ["a","b","c"]
let b: [String] = ["a","b","c"]
let s: String! = "a"
let c = ["a",s]
JSONSerialization.isValidJSONObject(a) //false
JSONSerialization.isValidJSONObject(b) //true
JSONSerialization.isValidJSONObject(c) //false
Run Code Online (Sandbox Code Playgroud)
这是预期的变化吗?
它似乎非常容易出错,因为任何使用隐式类型构造的数组或字典现在可能对JSON无效(即使它们实际上不包含任何nil值).
另外,如何指定空值?
更新:从Swift 3.0.1/Xcode 8.1 beta 2开始,选项会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"]
Run Code Online (Sandbox Code Playgroud)
Swift 2和3.0的上一个答案:仅NSNull()序列化为JSON null,而不是选项(独立于Swift版本).
可以像这样转换一组选项:
let a: [String?] = ["a", nil, "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",null,"c"]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3059 次 |
| 最近记录: |