【问题标题】:Swift JSONSerialization.data crashingSwift JSONSerialization.data 崩溃
【发布时间】: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?

标签: ios swift nsdictionary


【解决方案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 提供的有用错误,则无需询问。
猜你喜欢
  • 2014-12-01
  • 2017-03-19
  • 1970-01-01
  • 1970-01-01
  • 2021-01-08
  • 2016-05-14
  • 2016-06-20
  • 2018-03-11
  • 1970-01-01
相关资源
最近更新 更多