在Swift 3中使用选项的JSONSerialization

时间:2016-10-11 11:00:48

标签: json swift

在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

斯威夫特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值),这似乎很容易出错。

此外,如何指定空值?

1 个答案:

答案 0 :(得分:8)

更新: Swift 3.0.1 / Xcode 8.1 beta 2开始,可选项 自动桥接到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"]