Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 解码JSON时在两个结构中使用相同的编码键_Ios_Json_Swift - Fatal编程技术网

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

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 {

我正在制作一个小应用程序来练习将JSON解析到tableview中,我正在使用Ticketmaster API,这些是我设置的结构:

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]
}

类型不匹配的错误很明显:key
vention
的值是一个数组(注意JSON中的
[]
让vention:[vention]
哦,伙计,我在这里真的把重点放错了。很抱歉这个愚蠢的问题!所以我要把
vention
改为
[vention]
然后用下标访问
名称
值,我想,对吗?是的,
cell.venueLabel.text=event.embedded.vention[0].name
有效。谢谢你指出这一点,你真是太棒了!不过我很好奇,为什么必须使用下标来访问
场馆
中的值,而不是
事件
?它们都是数组,不是吗?
事件
显然是数组的一项。类型不匹配错误非常清楚:ke的值y
venue
是一个数组(注意JSON中的
[]
):
让venue:[venue]
哦,伙计,我真的把重点放错了。很抱歉这个愚蠢的问题!所以我要把
venue
改为
[venue]
然后用下标访问
名称
值,我想,对吗?是的,
cell.venueLabel.text=event.embedded.venue[0]。名称
起作用了。你太棒了,谢谢