我正在制作一个小应用程序来练习将JSON解析为tableview,并且我正在使用Ticketmaster API。This is the 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的值(WelcomeEvent)并都使用编码键_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下的数据结构与其他值相同,它们不会给我一个错误。
我在这里能做些什么来重新回到正轨?

最佳答案

请学习阅读Codable错误。它们非常,非常,非常具有描述性。
解码JSON时出错:typeMismatch(Swift.Dictionary,Swift.decoding Error.Context(codingPath:[CodingKeys(stringValue:“\embedded”,intValue:nil),CodingKeys(stringValue:“Index 0”,intValue:0),CodingKeys(stringValue:“\embedded”,intValue:nil),CodingKeys(stringValue:“venue”,intValue:nil)),debugDescription:“需要解码字典,但找到了数组。”,underyingerror: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是实际类型。
Adictionary是结构,array是结构的数组。
EventEmbedded更改为

struct EventEmbedded: Decodable {
    let venue: [Venue]
}

关于ios - 解码JSON时,在两个结构中使用相同的编码键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54391435/

10-12 04:35