【问题标题】:Swift JSONDecoder type mismatch on parsing ISO8601 DateInterval解析 ISO8601 DateInterval 时的 Swift JSONDecoder 类型不匹配
【发布时间】:2020-04-02 16:15:40
【问题描述】:

我正在尝试按照 ISO 8601 格式解析 Api 提供的下一个示例 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)]

小米解码功能使用8601策略,所以应该可以正常读取,确实可以使用ISO 8601 Date:

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】:

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

    无论如何,使用JSONDecoder 将ISO8601 字符串直接解码为DateInterval 是不可能的。

    【讨论】:

    • 谢谢 Vadian,我得从 String 构建一个解析器
    • 还要考虑DateInterval 是一个具有开始日期和结束日期或持续时间的结构,您可能是指TimeInterval,它仅表示根据ISO8601 字符串的持续时间。
    • 是的,TimeInterval 是我的第一个选项,但它以秒为单位,据我所知 JSONDecoder 也不会从 ISO8601 解析它。目标是读取 ISO8601 间隔日期并为用户提供时间选择器来编辑它们
    • PT1H10M 的持续时间为 70 秒。 ISO8601 interval 语法至少需要一个开始日期。
    • PT1H10M 根据 ISO8601 语法确实是 70 分钟的持续时间。我终于从头开始为 TimeInterval 构建了一个解析器。谢谢你的线索。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    相关资源
    最近更新 更多