Как исправить ошибку «нет значения» с CodingKeys? - PullRequest
0 голосов
/ 23 июня 2019

Я пытаюсь декодировать API из API ниже, но я все еще получаю ошибку ниже:

keyNotFound (CodingKeys (stringValue: "resources", intValue: nil), Swift.DecodingError.Context (codingPath: [_JSONKey (stringValue: "resources", intValue: nil)], debugDescription: "Нет значения, связанного с ключом CodingKeys (stringValue: \" resources \ ", intValue: nil) (\" resources \ "). ", underError: nil))

Адрес API: https://age -of-empires-2-api.herokuapp.com / docs /

Я уже несколько раз пытался просмотреть свои структуры и пробовать код вызова на разных уровнях API, но все еще не могу получить данные.Я также пытался вызывать объекты разных уровней в формате print (resources.XXX).

Это мой первый вызов данных из API:

{
  "resources": {
    "civilizations": "https://age-of-empires-2-api.herokuapp.com/api/v1/civilizations", 
    "units": "https://age-of-empires-2-api.herokuapp.com/api/v1/units", 
    "structures": "https://age-of-empires-2-api.herokuapp.com/api/v1/structures", 
    "technologies": "https://age-of-empires-2-api.herokuapp.com/api/v1/technologies"
  }
}

Это первые двауровни структур:

// MARK: - Resources
struct Resources: Codable {
    let resources: [String : ResourcesList]

    enum CodingKeys: String, CodingKey {
        case resources
    }
}

// MARK: - ResourcesList
struct ResourcesList: Codable {
    let civilizations: CivilizationList
    let units: UnitList
    let structures: StructureList
    let technologies: TechnologyList

    enum CodingKeys: String, CodingKey {
        case civilizations, units, technologies, structures
    }
}

Ниже этих структур я реализовал модели, указанные на веб-сайте API, например CivilizationList, Civilization и т. д.

Это мой код вызова:

        let jsonUrl = "https://age-of-empires-2-api.herokuapp.com/api/v1"
        guard let url = URL(string: jsonUrl) else { return }
        URLSession.shared.dataTask(with: url) { (data, response, error) in

            guard let data = data else { return }
            let dataAsString = String(data: data, encoding: .utf8)

            do {
                let decoder = JSONDecoder()
                let resources = try decoder.decode([String : Resources].self, from: data)
                print(resources)
            } catch {
                print(error)
            }
            print(dataAsString!)
        }.resume()

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

1 Ответ

0 голосов
/ 23 июня 2019

Модель должна быть

// MARK: - Empty
struct Resources: Codable {
    let resources: ResourcesList
}

// MARK: - Resources
struct ResourcesList: Codable {
    let civilizations, units, structures, technologies: String
}

Декодировать

let resources = try decoder.decode(Resources.self, from: data)

, поскольку civilizations, units, structures, technologies являются строками, а не моделями

ИЛИ

let resources = try decoder.decode([String : ResourcesList].self, from: data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...