我需要在 JSON 有效負載中決議以下日期,它幾乎是 ISO8601 格式。
"2020-06-05 14:52:54 UTC"
為了符合 ISO8601,它需要稍作改動。
"2020-06-05T14:52:54Z"
這非常煩人,因為我現在必須制定客戶日期解碼策略。
static func make() -> JSONDecoder {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
// decoder.dateDecodingStrategy = .iso8601
decoder.dateDecodingStrategy = .custom({ decoder in
let container = try decoder.singleValueContainer()
let dateStr = try container.decode(String.self)
guard let date = formatter.date(from: dateStr) else {
preconditionFailure("Unexpected date format.")
}
return date
})
return decoder
}
我無法控制資料源。在這種情況下,我能做些什么來避免自定義解碼策略嗎?
uj5u.com熱心網友回復:
由于您似乎只想使用 aDateFormatter來決議日期字串,請使用該formatted策略。
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss zzzz"
// or
// formatter.dateFormat = "yyyy-MM-dd HH:mm:ss 'UTC'"
// formatter.timeZone = .init(identifier: "UTC")
formatter.locale = Locale(identifier: "en_US_POSIX")
decoder.dateDecodingStrategy = .formatted(formatter)
uj5u.com熱心網友回復:
Sweeper 答案的替代方法是撰寫DateFormatter
extension DateFormatter {
static let almostISO8601Formatter: DateFormatter = {
let formatter = DateFormatter()
formatter.calendar = Calendar(identifier: .iso8601)
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss Z"
return formatter
}()
}
然后你的make()功能就變成了
static func make() -> JSONDecoder {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
decoder.dateDecodingStrategy = .formatted(.almostISO8601Formatter)
return decoder
}
還考慮將make()(使用更有意義的名稱)放在JSONDecoder
uj5u.com熱心網友回復:
您可以將輸入映射到 iso8601,以使用現有的解碼器:
func iso8601ify(_ str: String) -> String {
str.split(separator: " ")
.prefix(2)
.joined(separator: "T")
.appending("Z")
}
這個例子,當然沒有錯誤處理
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/504576.html
