Swift 3中带可选项的JSONSerialization



在Swift 3中,带有可选值的数组的JSONSerialization失败。
这在Swift 2中有效(nil可选项的JSON值为null,这是预期的)。

编辑:它没有,但把它留在这里,因为这是我问这个问题时的错误信念。

迅速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

迅速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

这是一个有意的改变吗?这似乎很容易出错,因为任何用隐式类型构造的数组或字典现在都可能对JSON无效(即使它们实际上不包含任何nil值)。

另外,如何指定空值呢?

更新:作为Swift 3.0.1/Xcode 8.1 beta 2,可选自动桥接到NSNull实例,参见

  • SE-0140 -当可选转换为Any时发出警告,并且桥接可选作为其有效载荷或NSNull

和Xcode 8.1 beta版本说明

的例子:

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", 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"]

最新更新