Expected date string to be ISO8601-formatted

我们定义一个 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?
}

就不会报错了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章