如何使用 Alamofire 在 Swift 3 中解析 JSON?
Posted
技术标签:
【中文标题】如何使用 Alamofire 在 Swift 3 中解析 JSON?【英文标题】:How to Parse JSON in Swift 3 using Alamofire? 【发布时间】:2017-04-21 10:29:59 【问题描述】:我正在使用 Swift 3。直到现在我还没有真正使用过 JSON。我正面临这个问题,我只能在 query
之前解析数据。之后没有数据被解析。请帮助我知道我在这里做错了什么。
JSON 代码:
"batchcomplete": "",
"continue":
"gpsoffset": 10,
"continue": "gpsoffset||"
,
"query":
"pages":
"445066":
"pageid": 445066,
"ns": 0,
"title": "RoboCop",
"index": 3,
"thumbnail":
"source": "https://upload.wikimedia.org/wikipedia/en/thumb/1/16/RoboCop_%281987%29_theatrical_poster.jpg/32px-RoboCop_%281987%29_theatrical_poster.jpg",
"width": 32,
"height": 50
,
"25781":
"pageid": 25781,
"ns": 0,
"title": "Robot",
"index": 1,
"thumbnail":
"source": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/05/HONDA_ASIMO.jpg/37px-HONDA_ASIMO.jpg",
"width": 37,
"height": 50
,
"2629669":
"pageid": 2629669,
"ns": 0,
"title": "Robot-assisted surgery",
"index": 8,
"thumbnail":
"source": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Laproscopic_Surgery_Robot.jpg/34px-Laproscopic_Surgery_Robot.jpg",
"width": 34,
"height": 50
,
"1527386":
"pageid": 1527386,
"ns": 0,
"title": "Robot Chicken",
"index": 9
,
"364093":
"pageid": 364093,
"ns": 0,
"title": "Robot Wars (TV series)",
"index": 2
,
"3977472":
"pageid": 3977472,
"ns": 0,
"title": "Robot competition",
"index": 10
,
"26333":
"pageid": 26333,
"ns": 0,
"title": "Robotech",
"index": 5,
"thumbnail":
"source": "https://upload.wikimedia.org/wikipedia/en/thumb/9/99/RobotechTitle1985.jpg/50px-RobotechTitle1985.jpg",
"width": 50,
"height": 38
,
"20903754":
"pageid": 20903754,
"ns": 0,
"title": "Robotics",
"index": 4,
"thumbnail":
"source": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c5/Shadow_Hand_Bulb_large.jpg/33px-Shadow_Hand_Bulb_large.jpg",
"width": 33,
"height": 50
,
"893808":
"pageid": 893808,
"ns": 0,
"title": "Robots (2005 film)",
"index": 7
,
"101673":
"pageid": 101673,
"ns": 0,
"title": "Robots exclusion standard",
"index": 6
Swift 代码:
var readableJSON = try JSONSerialization.jsonObject(with: JSONData, options:.mutableContainers) as? JSONStandard
print(readableJSON)
if let query = readableJSON?["query"] as? JSONStandard
print(query," Here!! ")
if let pages = readableJSON?["pages"] as? [JSONStandard]
print(pages," Check this! ")
for i in 0..<pages.count
let page = pages[i]
let id = page ["id"] as! String
//titles.append(id)
self.tableView.reloadData()
正如您在块 pages
中看到的那样,每个新块的声明都没有任何标识符,那么如何调用该特定块?
【问题讨论】:
您可以使用 swift 本机方法进行 json 解析,而无需使用 alarmofire @Balvansh Heerekar 您的代码有什么问题?错误是什么?似乎您在“查询”中有“页面”,但您解析错误。 您可以获得页面的所有键,然后您可以使用键值对访问每个块 @TusharSharma 我的代码问题是在query
之后我无法访问任何内容。是的,pages
存在于query
中。你能帮我解析一下吗?
@Balvansh Heerekar 解决方案由 vadian 提供。
【参考方案1】:
键 pages
的值是字典,而不是数组,它派生自 query
。
请阅读 JSON:[]
是数组 是字典。
没有键id
,它是pageid
,值是Int
(没有双引号)。
if let pages = query["pages"] as? JSONStandard
print(pages," Check this! ")
for (_, page) in pages
let id = page ["pageid"] as! Int
print(id)
titles.append("\(id)")
self.tableView.reloadData() // don't reload the table view in the loop.
或者——更简单——取字典的键,这也是id
数字(这里确实是String
)
if let pages = query["pages"] as? JSONStandard
print(pages," Check this! ")
for (id, page) in pages
print(id)
titles.append(id)
self.tableView.reloadData()
请注意,字典始终是无序的。
【讨论】:
只是怀疑是不是应该像 let pages = query ["pages"] as 一样? JSON标准以上是关于如何使用 Alamofire 在 Swift 3 中解析 JSON?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Alamofire 在 Swift 3 中解析 JSON?
Alamofire 4 请求返回 NSArray,无法弄清楚如何在 Swift 3 中使用 SwiftyJSON 进行解析
如何使用参数 swift 3.0 Alamofire 4.0 调用邮政服务?
如何使用 Alamofire 在 Xcode 8 Swift 3.0 中获取特定的 JSON?