如何在Swift中从Pray.zone API提取礼拜时间的数值数据?
如何从Pray.zone API响应中提取礼拜时间数据
我来帮你修改这段代码,让你顺利提取到times字段里的礼拜时间数值。咱们得顺着JSON的嵌套结构一步步解析,同时用可选绑定替代强制解包,避免程序因数据结构异常崩溃。
修改后的完整函数
let urlString = "https://api.pray.zone/v2/times/today.json?city=cairo" func getDataFromURL() { guard let url = URL(string: urlString) else { print("无效的URL") return } URLSession.shared.dataTask(with: url) { (data, response, error) in if let error = error { print("请求错误:\(error.localizedDescription)") return } guard let data = data else { print("未获取到数据") return } do { guard let parsedData = try JSONSerialization.jsonObject(with: data) as? [String: Any] else { print("JSON解析失败") return } // 开始逐层解析获取times数据 guard let results = parsedData["results"] as? [String: Any], let datetimeArray = results["datetime"] as? [[String: Any]], let firstDatetime = datetimeArray.first, let times = firstDatetime["times"] as? [String: String] else { print("未找到times数据") return } // 按需获取单个礼拜时间 print("晨礼(Fajr):\(times["Fajr"] ?? "未获取到")") print("晌礼(Dhuhr):\(times["Dhuhr"] ?? "未获取到")") print("晡礼(Asr):\(times["Asr"] ?? "未获取到")") print("昏礼(Maghrib):\(times["Maghrib"] ?? "未获取到")") print("宵礼(Isha):\(times["Isha"] ?? "未获取到")") // 若想一次性打印所有时间,可遍历字典 print("\n所有礼拜时间:") for (prayerName, time) in times { print("\(prayerName):\(time)") } } catch let error as NSError { print("JSON解析错误:\(error.localizedDescription)") } }.resume() }
解析步骤说明
- 安全校验前置条件:用
guard let替代强制解包,先验证URL有效性、请求数据是否存在,提前拦截错误 - 逐层拆解JSON结构:
- 从顶层字典取出
results字段(字典类型) - 从
results中取出datetime字段(数组类型,API返回的当天数据仅包含一个元素) - 取数组第一个元素,再从中取出
times字段(字典类型,键为礼拜名称,值为时间字符串)
- 从顶层字典取出
- 灵活获取时间数据:通过键名直接访问
times字典的对应值,用??给不存在的键设置默认值,避免出现nil
这样修改后,你就能精准拿到需要的礼拜时间数据啦~
内容的提问来源于stack exchange,提问作者Eyad Shokry
相关产品推荐
相关产品推荐

