ios - 解码 JSON 时在两个结构中使用相同的编码键
问题描述
我正在制作一个小应用程序来练习将 JSON 解析为 tableview,并且我正在使用 Ticketmaster API。这是 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
的结构与其余值的结构相同,并且它们不会给我一个错误。
我可以在这里做些什么不同的事情来重回正轨?
解决方案
请学会阅读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: "期望解码 Dictionary 但找到了一个数组。 " ,基础错误:无))
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
是结构体,anarray
是结构体的数组。
更改EventEmbedded
为
struct EventEmbedded: Decodable {
let venue: [Venue]
}
推荐阅读
- php - PHP 高级 HTMLDOM 错误
- sql - 在 SQL Server 2016 的一列中插入英语和阿拉伯语数据
- javascript - 使用带有formik的react-select时无法读取未定义的属性“类型”
- java - 警报对话未显示
- java - 为什么属性绑定(类型转换)在 Spring 4.3.15 中发生了变化:
- c++ - 从 unordered_multiset 中仅删除一项
- python - Python 3 无法在 CMD 中导入套接字,但在 IDLE 中可用
- gitlab - 未使用带有 Gitlab CI 的 Nerdbank.GitVersioning 设置云变量
- swift - 如何在 Swift 中以编程方式打开 icloud 应用程序(文件)
- iis-7 - 用于检查 IIS 的脚本