Другой тип ключа для одного и того же объекта json в ответе сети - PullRequest
0 голосов
/ 27 сентября 2019

У моего клиента есть сервис, который возвращает объекты Article.Есть свойство id, которое имеет тип UInt64.В том же API-интерфейсе, когда вы запрашиваете статьи категории, вы получаете ответ со статьями, но идентификатор является строкой.В настоящий момент никто не изменит эту глупость, поэтому я должен найти обходной путь, чтобы разобрать оба ответа.Моя модель выглядит примерно так:

struct Article {
  let id: UInt64
  let categoryName: String?
}

extension Article: Decodable {
  private enum Keys: String, CodingKey {
    case id
    case categoryName
}

init(from decoder: Decoder) throws {
    let container = try decoder.container(keyedBy: Keys.self)

    id = try container.decode(UInt64.self, forKey: Keys.id)
    categoryName = try container.decodeIfPresent(String.self, forKey: Keys.categoryName)
}

Как проверить тип Keys.id и использовать правильный метод для декодирования?Я должен использовать оба

   id = try container.decode(UInt64.self, forKey: Keys.id)
   id = try container.decode(String.self, forKey: Keys.id) 

, чтобы правильно проанализировать мои объекты в обоих случаях.Заранее спасибо

1 Ответ

0 голосов
/ 27 сентября 2019

Если вы хотите обходной путь, тогда ответ ниже делает это.Я не знаю, возможно ли это также хороший способ сделать это.С нетерпением жду, чтобы улучшить этот ответ.Предложения приветствуются.

extension Article: Decodable {
private enum Keys: String, CodingKey {
    case id
    case categoryName
}

init(from decoder: Decoder) throws {
    let container = try decoder.container(keyedBy: Keys.self)
    // check if id is of type UInt64
    do{
        id = try container.decodeIfPresent(UInt64.self, forKey: Keys.id) ?? 0

    }catch{
        // if id is of String type convert it to UInt64
        // do catch can be used here too
        let str = try container.decodeIfPresent(String.self, forKey: Keys.id)
        id = UInt64(str ?? "0") ?? 0

    }
    categoryName = try container.decode(String.self, forKey: Keys.categoryName)

}
} 
...