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?
}

就不會報錯了。

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