从NSDictionary获取JSON数据:无法提取API的Time与Price字段求助
Swift JSON解析:提取Time和Price字段解决方案
看起来你在Swift里解析API返回的JSON时,卡在了提取Time和Price字段这一步,我来帮你梳理清楚怎么解决这个问题!
首先,Swift里解析JSON最省心的方式是用Codable协议,我们只需要先定义和API返回结构完全对应的模型结构体,然后用JSONDecoder来解析数据就行。
第一步:定义对应JSON结构的Codable模型
根据你给出的API返回数据,我们需要两个结构体:一个对应整个响应,另一个对应Prices数组里的每一项:
// 对应Prices数组中的单个价格项 struct PriceItem: Codable { let Time: Int let Price: Int } // 对应整个API返回的响应体 struct PriceResponse: Codable { let Hall: String let Date: Int let Prices: [PriceItem] }
注意:模型的属性名要和JSON里的字段完全匹配(包括大小写),比如JSON里是
Time,模型里不能写成time,否则解析会失败。如果想遵循Swift的小驼峰命名规范,可以用CodingKeys做字段映射,我后面会补充这个写法。
第二步:补全URLSession请求的解析逻辑
你已经写了请求的开头,现在需要在dataTask的回调里完成数据解析,提取出Time和Price:
let url = URL(string: "http://<...>/api/prices?hall=<...>&date=20180501") var request = URLRequest(url: url!) request.httpMethod = "GET" let task = URLSession.shared.dataTask(with: request) { data, response, error in // 先处理请求错误 if let error = error { print("请求出错啦: \(error.localizedDescription)") return } // 确保拿到了有效数据 guard let responseData = data else { print("没有获取到任何数据") return } do { // 把JSON数据解析成我们定义的模型 let priceResponse = try JSONDecoder().decode(PriceResponse.self, from: responseData) // 现在可以遍历Prices数组,轻松提取Time和Price了! for priceItem in priceResponse.Prices { print("场次编号: \(priceItem.Time),价格: \(priceItem.Price)") // 这里可以把数据存到变量里,或者更新UI(注意要切回主线程) DispatchQueue.main.async { // 比如更新表格视图、标签等UI元素 } } } catch { print("解析失败: \(error.localizedDescription)") // 打印详细错误信息,方便排查问题(比如字段不匹配、类型错误) print("详细错误原因: \(error)") } } task.resume()
可选优化:用CodingKeys遵循Swift命名规范
如果觉得模型里的大写属性名不符合Swift的小驼峰习惯,可以用CodingKeys来映射JSON字段和Swift属性:
struct PriceItem: Codable { let time: Int let price: Int // 映射JSON字段到Swift属性 enum CodingKeys: String, CodingKey { case time = "Time" case price = "Price" } } struct PriceResponse: Codable { let hall: String let date: Int let prices: [PriceItem] enum CodingKeys: String, CodingKey { case hall = "Hall" case date = "Date" case prices = "Prices" } }
这样修改后,解析的时候就可以用priceItem.time和priceItem.price来访问字段了,更符合Swift的编码习惯。
常见排查点
如果还是解析失败,你可以检查这几点:
- 确认API返回的JSON格式和你提供的完全一致,有没有额外的嵌套或者字段拼写错误
- 检查模型的属性类型是否和JSON里的类型匹配(比如JSON里的Price是数字,你不能用String类型)
- 打印解析时的详细错误信息,错误提示会告诉你具体是哪个字段出了问题
内容的提问来源于stack exchange,提问作者Дмитрий Деникаев
相关产品推荐
相关产品推荐

