Swift JSONSerialization.data 崩溃

Posted

技术标签:

【中文标题】Swift JSONSerialization.data 崩溃【英文标题】:Swift JSONSerialization.data crashing 【发布时间】:2021-08-23 16:22:47 【问题描述】:

我在下面有一个示例 2 结构,

struct Person: Codable 
    let a: String
    let b: [Department]


struct Department: Codable 
    let bb: String


let dict = ["a": "aa", "b": [Department(bb: "D")]] as [String : Any]
// Crashing here
let data = try? JSONSerialization.data(withJSONObject: dict, options: .prettyPrinted) 

我尝试从字典创建 Person 对象,我得到一个崩溃 JSON 写入中的无效类型 (__SwiftValue)',我知道 Codable 是 Swift 类型 JSONSerialization.data 将不接受,我该如何转换它。我不想手动构建 Person 对象

【问题讨论】:

为什么不使用 Codable? 如何从 Person 到 dict? 【参考方案1】:

首先,您不能使用以下类型对字典进行编码:[String:Any],因为协议“Any”作为一种类型不能符合“Encodable”,因此在您的示例中,您必须创建两个不同类型的字典:[String :String] 和 [String:Department]。

要对 Person 实例进行编码,您需要这样做:

let person = Person(a="example", b=Department(bb="example"))
let personData = try? JSONEncoder().encode(person)

要解码 Person 实例,您需要执行以下操作:

let decodedPerson = try? JSONDecoder().decode(Person.self, from: personData)

如果你收到一个 JSON 对象,你可以像这样解码它:

let data = try? JSONSerialization.data(withJSONObject: object, options: .prettyPrinted)
let decodedPerson = try? JSONDecoder().decode(Person.self, from: data)

【讨论】:

不要使用try ?进行解码。这是一种可怕的模式,它遍布 json 解码示例,并导致大约 90% 的关于 SO 的 JSONDecoder 问题,如果使用正确的do/try/catch 来捕获和打印 JSONDecoder 提供的有用错误,则无需询问。

以上是关于Swift JSONSerialization.data 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Swift入门系列--Swift官方文档(2.2)--中文翻译--About Swift 关于Swift

swift 示例BS swift.swift

swift swift_bug.swift

ios 整理(一)swift和oc的区别

swift swift_extension5.swift

swift swift_optional4.swift