You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:32:04