在解析ISO8601 DateInterval时,Swift JSONDecoder类型不匹配

问题描述 投票:-1回答:1

我正在尝试解析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)))
    }

}

这里可能缺少什么?

swift iso8601 jsondecoder dateinterval
1个回答
1
投票

iso8601日期解码策略仅支持将yyyy-MM-dd'T'HH:mm:ssZ解码为String的格式Date

无论如何都无法用DateInterval将ISO8601字符串直接解码为JSONDecoder

© www.soinside.com 2019 - 2024. All rights reserved.