我正在尝试解析Api遵循ISO 8601格式的下一个示例DateInterval值:
[
{"ISO8601":"PT10M","text":"time: 00:10"},
{"ISO8601":"PT1H10M","text":"time: 01:10"},
{"ISO8601":"PT3H20M","text":"time: 03:20"}
]
至下一个型号:
struct DTOTest:Codable {
var ISO8601:DateInterval
var text:String
}
但是我得到下一个不匹配异常:
类型'字典'不匹配上下文:预期要解码字典,但是找到了一个字符串/数据。编码路径:[_JSONKey(stringValue:“索引0”,intValue:0),CodingKeys(stringValue:“ ISO8601”,intValue:nil)]
Mi解码功能使用8601策略,因此应该正确读取它,并且确实可以在ISO 8601日期下正常工作:
static func decode<T:Decodable>(data:Data, completion: @escaping (Result<T,NetworkError>) -> Void) {
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
do {
let retval = try decoder.decode(T.self, from: data)
completion(.success(retval))
} catch let DecodingError.typeMismatch(type, context) {
var reason = "Type '\(type)' mismatch"
reason += "\nContext: \(context.debugDescription)"
reason += "\nCodingPath: \(context.codingPath)"
completion(.failure(.requestError(reason: reason)))
} catch {
let reason = "Error '\(error.localizedDescription)'"
completion(.failure(.requestError(reason: reason)))
}
}
这里可能缺少什么?
iso8601
日期解码策略仅支持将yyyy-MM-dd'T'HH:mm:ssZ
解码为String
的格式Date
。
无论如何都无法用DateInterval
将ISO8601字符串直接解码为JSONDecoder
。