Swift4中JSON响应转NSData/NSDictionary及API获取JSON数组问题
嗨,我来帮你解决这两个Swift相关的问题:
1. 在Swift 4中将JSON响应转换为NSData或NSDictionary的方法
转换为NSData
在Swift 4中,Data和NSData是无缝桥接的,如果你已经拿到了JSON对应的Swift Data对象,直接强制转换即可:
let swiftData: Data = ... // 你的JSON数据 let nsData = swiftData as NSData
如果是从Alamofire的响应里获取,直接取response.data再转成NSData就可以。
转换为NSDictionary
你可以用JSONSerialization来解析JSON数据并转成NSDictionary,注意要处理解析可能出现的错误:
if let data = response.data { do { // 直接解析为NSDictionary if let nsDict = try JSONSerialization.jsonObject(with: data, options: []) as? NSDictionary { // 这里就拿到了可用的NSDictionary对象 print(nsDict) } else { print("JSON响应不是字典格式") } } catch { print("JSON解析失败:\(error.localizedDescription)") } }
也可以先解析成Swift原生字典,再桥接为NSDictionary,效果是一样的:
do { if let swiftDict = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any], let nsDict = swiftDict as NSDictionary { print(nsDict) } } catch { print("解析错误:\(error)") }
2. 完善你的Alamofire航班数据请求代码
先提醒你个小细节:你的参数里把minutesAhead拼成miutesAhead了,这个拼写错误会导致API无法正确识别该参数,得先改过来。
下面是补全后的完整代码,包含请求发送、响应处理以及JSON转NSData/NSDictionary的逻辑:
import Alamofire func getFlightData(airportCode: String, minutesBehind: String, minutesAhead: String) { let securityToken: String = "Basic YWFnZTQxNDAxMjgwODYyNDk3NWFiYWNhZjlhNjZjMDRlMWY6ODYyYTk0NTFhYjliNGY1M2EwZWJiOWI2ZWQ1ZjYwOGM=" var headers: HTTPHeaders = [:] headers["Authorization"] = securityToken // 修正拼写错误:miutesAhead → minutesAhead let parameters: Parameters = [ "city": airportCode, "minutesBehind": minutesBehind, "minutesAhead": minutesAhead ] // 补充请求方法和响应回调,这里默认用GET,若API是POST可改成.method(.post) Alamofire.request("https://api.qa.al...", method: .get, parameters: parameters, headers: headers) .responseData { response in switch response.result { case .success(let data): // 转换为NSData let nsData = data as NSData print("转换后的NSData:\(nsData)") // 转换为NSDictionary do { if let nsDict = try JSONSerialization.jsonObject(with: data, options: []) as? NSDictionary { print("转换后的NSDictionary:\(nsDict)") // 在这里可以添加你的业务逻辑,比如解析航班数据 } else { print("注意:JSON响应是数组格式,不是字典") // 如果是数组格式,你可以转成NSArray if let nsArray = try JSONSerialization.jsonObject(with: data, options: []) as? NSArray { print("转换后的NSArray:\(nsArray)") } } } catch { print("JSON解析失败:\(error.localizedDescription)") } case .failure(let error): print("请求失败:\(error.localizedDescription)") } } }
说明一下:
- 我补充了
method: .get参数(如果你的API是POST请求,改成.post即可),并添加了responseData回调来处理响应 - 在成功回调里,既处理了转NSData的逻辑,也针对JSON是字典/数组的情况分别做了解析处理
- 同时覆盖了请求失败、JSON格式不匹配等异常场景,让代码更健壮
内容的提问来源于stack exchange,提问作者Ackman
相关产品推荐
相关产品推荐

