扩展 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 具有以下内容的数据成功解码:
- 标题
- 标题和页数
- 标题和作者
- 标题、页数和作者
但是,由于标题不是可选的,如果 JSON 数据不包含标题,它将失败。
我有很多模型,根据端点的不同,或者以不同的方式序列化。我的第一次尝试是 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 具有以下内容的数据成功解码:
- 标题
- 标题和页数
- 标题和作者
- 标题、页数和作者
但是,由于标题不是可选的,如果 JSON 数据不包含标题,它将失败。