我们定义一个 time 类型为 Date
例如:
struct SessionTime: Codable {
let sessionStartTime: Date?
let sessionEndTime: Date?
let newSessionStartTime: Date?
let newSessionEndTime: Date?
}
并且在解析的时候,后端返回我们的都是 ISO8601 类型,这个时候,我们只需要定义一下 decoder 一下就可以:
lazy var jsonDecoder: JSONDecoder = {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
decoder.dateDecodingStrategy = .iso8601
return decoder
}()
然而,这些Date有可能偶尔没有值,这个之后如果后端返回给我们 “”的话,用 jsonDecoder 解析时就会报错:Expected date string to be ISO8601-formatted
后端返回:
"session_start_time" : "2019-12-03T16:00:00+00:00",
"session_end_time" : "2019-12-03T17:00:00+00:00",
"new_session_start_time": "",
"new_session_end_time" : "",
解决办法:
public struct SafeDateCodableType: Codable {
public var dateValue: Date?
public init(from decoder: Decoder) throws {
if let container = try? decoder.singleValueContainer() {
dateValue = try? container.decode(Date.self)
}
}
public func encode(to encoder: Encoder) throws {
var container = encoder.singleValueContainer()
if let date = dateValue {
try container.encode(date)
}
}
}
,此时,模型重新定义为:
struct SessionTime: Codable {
let sessionStartTime: SafeDateCodableType?
let sessionEndTime: SafeDateCodableType?
let newSessionStartTime: SafeDateCodableType?
let newSessionEndTime: SafeDateCodableType?
}
就不会报错了。