【发布时间】:2020-07-01 02:31:42
【问题描述】:
我对 swift 编程语言相当陌生,并且在过去一周左右的时间里一直在努力让它工作。我正在使用一个现有的 API,它返回 JSON 数据,其结构会根据返回的场地数量而略有变化。
实际结构稍微复杂一些,但这个例子说明了问题。在一种结果中,我得到一个返回的场地,例如:
{
"totalItems": 21,
"pageSize": 2,
"venues": {
"venue":
{
"name": "Venue Name 1"
"location": "Location A",
"showCount": "4"
}
}
}
在另一种结果中,我返回了一系列场地:
{
"totalItems": 21,
"pageSize": 2,
"venues": {
"venue":
[{
"name": "Venue Name 1"
"location": "Location A",
"showCount": "4"
},
{
"name": "Venue Name 2"
"location": "Location B",
"showCount": "2"
}]
}
}
是的 - 此 API 的所有者无论如何都应该返回一个数组,但他们没有,而且无法更改。
我能够为一系列场地正确解码(或者即使没有通过场地),但是当通过单个场地时它会中止(当然是由于结构变化)。当我将代码更改为容纳单个场地时,我的代码也可以正常工作,但随后多个场地的返回中止。
我想做的是将任一变体解码为包含数组的内部结构,而不管我收到哪种变体,从而使我以后以编程方式处理事情变得更加简单。像这样的:
struct Response: Decodable {
let totalItems: Int
let pageSize: Int
let venues: VenueWrapper
struct VenueWrapper: Decodable {
let venue: [Venue] // This might contain 0, 1, or more than one venues
}
struct Venue: Decodable {
let name: String
let location: String
let showCount: Int
}
}
注意:在实际的 JSON 响应中,响应中实际上有几个这样的子结构(例如,单个结构与结构数组),这就是为什么我觉得简单地创建一个替代结构不是一个好的解决方案。
我希望以前有人遇到过这种情况。提前致谢!
【问题讨论】:
-
你能提供一个更接近现实的例子来说明你必须使用什么吗?您缺少逗号,因此这不是有效的 JSON。并且您的
Response无法按原样解码,因为showCounts 是字符串。 -
感谢您的快速回复。实际的 JSON 要复杂得多,所以我尝试对其进行修剪,以专注于真正的问题,即数组或非数组部分。在我自己的代码中,我添加了将字符串转换为整数的自定义逻辑,但没有包含它。
-
抱歉 - 在我准备好之前,“返回”触发了我的评论。 (我仍然是在这里发帖的新手。)我试图避免发布整个 json,因为它很长。我可能应该删除 showCount 项目周围的引号,因为它会影响问题。
标签: arrays json swift decodable