Ios 解码JSON时在两个结构中使用相同的编码键
我正在制作一个小应用程序来练习将JSON解析到tableview中,我正在使用Ticketmaster API,这些是我设置的结构:Ios 解码JSON时在两个结构中使用相同的编码键,ios,json,swift,Ios,Json,Swift,我正在制作一个小应用程序来练习将JSON解析到tableview中,我正在使用Ticketmaster API,这些是我设置的结构: struct Welcome: Decodable { let embedded: WelcomeEmbedded enum CodingKeys: String, CodingKey{ case embedded = "_embedded" } } struct WelcomeEmbedded: Decodable {
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
struct之前,一切正常,但在添加该行之后,运行应用程序时,我得到一个错误:
错误解码JSON:typeMismatch(Swift.Dictionary,Swift.DecodingError.Context(codingPath:[CodingKeys(stringValue:“\u embedded”,intValue:nil),CodingKeys(stringValue:“events”,intValue:nil),_JSONKey(stringValue:“Index 0”,intValue:0),CodingKeys(stringValue:“\u embedded”,intValue:nil),CodingKeys(stringValue:“地点”,intValue:nil)],debugDescription:“应解码字典,但找到了数组。”,underlineError:nil))
我想知道单独添加那一行是如何导致错误的,这与我在两个结构中有一个名为嵌入的值(欢迎
和事件
),并且都使用编码键\u嵌入
有关吗
对于一些添加的细节,要解析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()
}
}
中的fetchData(url:apirl){(result:FetchResult)->(Void)
切换结果{
case.success(let对象):self.eventData=object.embedded.events
case.failure(let error):打印(“\n错误解码JSON:\(错误)\n\n”)
}
DispatchQueue.main.async{
self.tableView.reloadData()
}
}
错误还表示CodingKeys(stringValue:“venue”,intValue:nil)],debugDescription:“应该解码字典,但找到了一个数组。
。但是看看JSON,venue
下的数据与其他值的结构相同,它们不会给我错误
我在这里可以做些什么不同的事情才能回到正轨?请学习阅读可编码的
错误。它们非常、非常、非常具有描述性
解码JSON时出错:类型不匹配(Swift.Dictionary,Swift.DecodingError.Context(编码路径:[编码键(stringValue:\u embedded”,intValue:nil),编码键(stringValue:“events”,intValue:nil),\u JSONKey(stringValue:“Index 0”,intValue:0),编码键(stringValue:\u embedded“,intValue:nil),编码键(stringValue:“地点”,intValue:nil)],调试说明:“应解码字典,但找到了数组。”,underyingError:nil))
类型不匹配
是错误类型
CodingKeys(stringValue:“\u embedded”)、CodingKeys(stringValue:\u embedded)、CodingKeys(stringValue:\u embedded”)
是密钥路径(\u embedded/events/\u embedded/venue
)
应解码字典,但却找到了数组
是错误消息
Expected
是您建议的错误类型
found
是实际类型
字典
是结构,数组
是结构的数组
将EventEmbedded
更改为
struct EventEmbedded: Decodable {
let venue: [Venue]
}
请学习阅读Codable
错误。它们非常、非常、非常具有描述性
解码JSON时出错:类型不匹配(Swift.Dictionary,Swift.DecodingError.Context(编码路径:[编码键(stringValue:\u embedded”,intValue:nil),编码键(stringValue:“events”,intValue:nil),\u JSONKey(stringValue:“Index 0”,intValue:0),编码键(stringValue:\u embedded),intValue:nil),编码键(stringValue:“地点”,intValue:nil)],调试说明:“应解码字典,但找到了数组。,UnderlineError:nil))
类型不匹配
是错误类型
CodingKeys(stringValue:“\u embedded”)、CodingKeys(stringValue:\u embedded)、CodingKeys(stringValue:\u embedded”)
是密钥路径(\u embedded/events/\u embedded/venue
)
应解码字典,但却找到了数组
是错误消息
Expected
是您建议的错误类型
found
是实际类型
字典
是结构,数组
是结构的数组
将EventEmbedded
更改为
struct EventEmbedded: Decodable {
let venue: [Venue]
}
类型不匹配的错误很明显:keyvention
的值是一个数组(注意JSON中的[]
)让vention:[vention]
哦,伙计,我在这里真的把重点放错了。很抱歉这个愚蠢的问题!所以我要把vention
改为[vention]
然后用下标访问名称
值,我想,对吗?是的,cell.venueLabel.text=event.embedded.vention[0].name
有效。谢谢你指出这一点,你真是太棒了!不过我很好奇,为什么必须使用下标来访问场馆
中的值,而不是事件
?它们都是数组,不是吗?事件
显然是数组的一项。类型不匹配错误非常清楚:ke的值yvenue
是一个数组(注意JSON中的[]
):让venue:[venue]
哦,伙计,我真的把重点放错了。很抱歉这个愚蠢的问题!所以我要把venue
改为[venue]
然后用下标访问名称
值,我想,对吗?是的,cell.venueLabel.text=event.embedded.venue[0]。名称
起作用了。你太棒了,谢谢