Swift JSONDecoder несоответствие типов при разборе ISO8601 DateInterval - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь проанализировать следующий пример значений DateInterval, которые Api поддерживает в следующем формате ISO 8601:

[
    {"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
}

Но я получаю следующее исключение несоответствия:

Несоответствие типа 'Dictionary' Контекст: ожидается декодирование словаря, но вместо него найдена строка / данные. CodingPath: [_JSONKey (stringValue: «Index 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)))
    }

}

Что здесь может отсутствовать?

1 Ответ

1 голос
/ 02 апреля 2020

Стратегия декодирования даты iso8601 поддерживает только формат yyyy-MM-dd'T'HH:mm:ssZ для декодирования String в Date.

Невозможно декодировать строку ISO8601 напрямую в DateInterval с JSONDecoder в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...