扩展 JSONDecoder 以允许模型根据端点进行不同的序列化

Extend JSONDecoder to allow for models to be serialized differently based on endpoint

我有很多模型,根据端点的不同,或者以不同的方式序列化。我的第一次尝试是 init(from decoder: Decoder) 充满了嵌套的 try catch 块。我认为更好的解决方案是扩展 JSONDecoder 以便在我初始化一个时,我可以指定我从哪个端点拉出。然后在我的模型中 init(from decoder: Decoder) 我可以有一个 switch

switch
case endpoint1:
   x = decoder.decode(Int.self, .x)
case endpoint2:
   j = decoder.decode(String.self, .j)

我 运行 遇到的问题是 init 中的 class 是 Decoder 而不是 JSONDecoder。我想不出一个地方,如果我扩展 Decoder 并允许自己指定一个端点,我实际上可以指定一个端点,因为 JSONDecoder.decode() 在幕后实例化它自己的 Decoder .想法?

我假设在之前使用 CocoaPod 进行 JSON 解码和编码后,我实际上 需要 一种方法来处理同一模型的不同序列化,但值得庆幸的是Codable 几乎可以自行处理。任何不会出现在每个序列化中的成员,只需用 ? 标记为可选,如果解码器找不到它的密钥,它将跳过它而不是失败。同样,编码器将只编码不是 nil 的成员。 示例:

class Book: Codable {
    var title: String
    var numPages: Int?
    var author: String?
    enum CodingKeys: String, CodingKey {
        case title
        case numPages = "number_of_pages"
        case author
    }
}

此模型将从 JSON 具有以下内容的数据成功解码:

  1. 标题
  2. 标题和页数
  3. 标题和作者
  4. 标题、页数和作者

但是,由于标题不是可选的,如果 JSON 数据不包含标题,它将失败。