Использование одного и того же ключа кодирования в двух структурах при декодировании JSON - PullRequest
0 голосов
/ 27 января 2019

Я создаю небольшое приложение для практики анализа JSON в виде таблицы и использую API Ticketmaster. Это JSON , и это структуры, которые я настроил:

struct Welcome: Decodable {
    let embedded: WelcomeEmbedded
    enum CodingKeys: String, CodingKey{
        case embedded = "_embedded"
    }
}

struct WelcomeEmbedded: Decodable {
    let events: [Event]
}

struct Event: Decodable {
    let name: String
    let dates: Dates
    let eventUrl: String?
    let embedded: EventEmbedded

    enum CodingKeys: String, CodingKey {
        case name
        case dates
        case eventUrl
        case embedded = "_embedded"
    }
}

struct EventEmbedded: Decodable {
    let venue: Venue
}

struct Dates: Decodable {
    let start, end: End
}

struct Venue: Decodable {
    let name: String
}

Перед добавлением значения let embedded: EventEmbedded в структуру Event все работало нормально,но после добавления в эту строку, при запуске приложения я получаю сообщение об ошибке:

Error decoding JSON: typeMismatch(Swift.Dictionary<Swift.String, Any>, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "_embedded", intValue: nil), CodingKeys(stringValue: "events", intValue: nil), _JSONKey(stringValue: "Index 0", intValue: 0), CodingKeys(stringValue: "_embedded", intValue: nil), CodingKeys(stringValue: "venue", intValue: nil)], debugDescription: "Expected to decode Dictionary<String, Any> but found an array instead.", underlyingError: nil))

Мне интересно, как добавление только этой строки приводит к ошибке, это что-то делатьс тем фактом, что у меня есть значение с именем embedded в двух структурах (Welcome и Event), и оба используют ключ кодирования _embedded?

Для некоторых дополнительных деталей, чтобы проанализировать JSONУ меня есть переменная var eventData = [Event](), и я вызываю эту функцию в viewDidLoad, чтобы заполнить eventData необходимыми данными:

    fetchData(url: apiUrl) { (result: FetchResult<Welcome>) -> (Void) in

        switch result {
        case .success(let object): self.eventData = object.embedded.events
        case .failure(let error): print("\nError decoding JSON: \(error)\n\n")
        }
        DispatchQueue.main.async {
            self.tableView.reloadData()
        }
    }

Ошибка также говорит CodingKeys(stringValue: "venue", intValue: nil)], debugDescription: "Expected to decode Dictionary<String, Any> but found an array instead..Но, глядя на JSON, данные в venue структурированы так же, как и остальные значения, и они не дают мне ошибки.

Что я могу сделать здесь по-другому, чтобы вернуться котслеживать

1 Ответ

0 голосов
/ 27 января 2019

Пожалуйста, научитесь читать Codable ошибки.Они очень, очень, очень наглядны.

Ошибка декодирования JSON: typeMismatch (Swift.Dictionary, Swift.DecodingError.Context (codingPath: [ CodingKeys (stringValue:"_embedded" , intValue: nil), CodingKeys (stringValue: "events" , intValue: nil), _JSONKey (stringValue: "Index 0", intValue: 0), CodingKeys (stringValue: "_embedded" , intValue: nil), CodingKeys (stringValue: "venue" , intValue: nil)], debugDescription: "Ожидается декодирование словаря, но вместо этого найден массив. ", underError: nil))

  • typeMismatch - это тип ошибки
  • CodingKeys(stringValue: "_embedded", CodingKeys(stringValue: "events"), CodingKeys(stringValue: "_embedded"), CodingKeys(stringValue: "venue") - путь к ключу (_embedded/events/_embedded/venue)
  • Expected to decode Dictionary<String, Any> but found an array instead - это сообщение об ошибке.

    • Expected - неправильный тип, который вы предложили.
    • found - фактический тип.

      A dictionary - это структура, array - это массив структуры.

Изменить EventEmbedded на

struct EventEmbedded: Decodable {
    let venue: [Venue]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...