解码JSON时,在两个结构中使用相同的编码键

时间:2019-01-27 18:23:05

标签: ios json swift

我正在制作一个小型应用程序,以练习将JSON解析为表格视图,并且正在使用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的值(Welcome和{{1} }),并且都使用编码键Event

有关一些附加细节,要解析JSON,我有一个变量_embedded,并在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() } } 。但是看看JSON,CodingKeys(stringValue: "venue", intValue: nil)], debugDescription: "Expected to decode Dictionary<String, Any> but found an array instead.下的数据的结构与其余值相同,并且它们不会给我带来错误。

在这里我可以做些什么不同才能回到正轨?

1 个答案:

答案 0 :(得分:2)

请学习阅读Codable错误。它们非常非常具有描述性。

  

错误解码JSON: typeMismatch (Swift.Dictionary,Swift.DecodingError.Context(codingPath:[ CodingKeys(字符串值:“ _ embedded” ,intValue:nil)),< strong> CodingKeys(stringValue:“ events” ,intValue:nil),_JSONKey(stringValue:“ Index 0”,intValue:0), CodingKeys(stringValue:“ _embedded” ,intValue: nil), CodingKeys(stringValue:“ venue” ,intValue:nil)],debugDescription:“希望对Dictionary进行解码,但找到了一个数组。”,底层错误: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是实际类型。

      dictionary是结构,array是结构的数组。

EventEmbedded更改为

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