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 崩溃的主要内容,如果未能解决你的问题,请参考以下文章