Alamofire 和 SwiftyJSON 错误

Posted

技术标签:

【中文标题】Alamofire 和 SwiftyJSON 错误【英文标题】:Alamofire and SwiftyJSON Error 【发布时间】:2015-06-20 21:51:44 【问题描述】:

我已经用 Cocoapods 安装了 Alamofire 和 SwiftyJSON。独立地,每个人都工作得很好。但是,当我尝试将两者混合时出现错误。

在使用 Alamofire 之前,我使用 NSURLConnection 下载数据。当 connectionHandler 完成后,我使用 SwiftyJSON 创建了一个 JSON 对象。

        let json = JSON(data: self.downloadedData!)

这没有任何问题。

为了让事情更清洁,我想使用 Alamofire。当我使用 Alamofire 时,我尝试使用 SwiftyJSON 创建一个 JSON 对象。

Alamofire.request(.GET, "http://162.208.56.92/json_service.php").responseJSON()
            
                (_, _, JSON, _) in

                let json = JSON(data: JSON)
        

当我这样做时,我收到以下错误。

无法使用类型为“(数据: 任何对象?)'

由于 JSON 采用 NSData 参数,因此我尝试了以下方法。

Alamofire.request(.GET, "http://162.208.56.92/json_service.php").responseJSON()
            
                (_, _, JSON, _) in

                let json = JSON(data: JSON as! NSData)
        

这给了我以下错误。

无法使用类型为“(数据:NSData)”的参数列表调用“JSON”

我被难住了。有什么想法吗?

【问题讨论】:

【参考方案1】:

嘿,我同时使用 Alamofire 和 SwiftyJSON 从图像字典中获取 url 在这里我的代码看起来如何

var Photos = [String]() 
override func viewDidLoad() 
    super.viewDidLoad()
       Alamofire.request(.GET, "https://api.500px.com/v1/photos",parameters:["consumer_key":"gRU4LletUCA9RiOQhaJBAt62UyRRYUE6vsIcC7fO"])
         .responseJSON  _,_,result in
            switch result 
            case .Success(let data):
                let json = JSON(data)
                self.Photos = self.ParseJSON(json)
            case .Failure(_, let error):
                print("Request failed with error: \(error)")
            
            debugPrint(self.Photos)
    

基本上所做的是发出请求,如果成功,我将数据保存在 JSON 对象中,然后我只需解析名为 Photos 的数组中的 image_url

这也是我的 ParseJSON 乐趣

func ParseJSON(json:JSON)->[String]

    //Get Image_URL
    var pictures = [String]()
    for result in json["photos"].arrayValue
        pictures.append(result["image_url"].stringValue)
    
    return pictures

我目前正在使用 Almaofire 2.1 以及最新版本的 SwiftyJSON

【讨论】:

【参考方案2】:

您必须使用 dataUsingEncoding 对结果进行编码。尝试使用以下代码转换您的结果:

    Alamofire.request(.GET, "http://162.209.75.59/json_service.php").responseJSON()
    
        (_, _, responseBody, _) in
        // Convert the response to NSData to handle with SwiftyJSON
        if let data = (responseBody as NSString).dataUsingEncoding(NSUTF8StringEncoding) 
            let json = JSON(data: data)
            println(json)
        
    

【讨论】:

感谢您的回复。这一行 if let data = (responseBody as!NSString).dataUsingEncoding(NSUTF8StringEncoding) 调用了以下错误。无法将“__NSCFDictionary”(0x10611ca60)类型的值转换为“NSString”(0x1065ac8e0)。【参考方案3】:

lcaro 的回答让我朝着正确的方向前进,但我不得不做出一些改变。下面的代码是 lcaro 的答案。

 Alamofire.request(.GET, "http://162.209.75.59/json_service.php").responseJSON()
    
        (_, _, responseBody, _) in
        // Convert the response to NSData to handle with SwiftyJSON
        if let data = (responseBody as NSString).dataUsingEncoding(NSUTF8StringEncoding) 
            let json = JSON(data: data)
            println(json)
        
    

我将 responseJON() 更改为 responseString(),然后删除了 responseBody 上的 NSString。

 Alamofire.request(.GET, "http://162.209.75.59/json_service.php").responseString()
    
        (_, _, responseBody, _) in
        // Convert the response to NSData to handle with SwiftyJSON
        if let data = (responseBody).dataUsingEncoding(NSUTF8StringEncoding) 
            let json = JSON(data: data)
            println(json)
        
    

【讨论】:

以上是关于Alamofire 和 SwiftyJSON 错误的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire 和 SwiftyJSon 在请求函数之外获得价值

Alamofire/Swiftyjson - 将 JSON 类型传递给 Objc 协议委托

没有这样的模块“Alamofire”、“SwiftyJson”、“UiKiT”

数据未使用 Alamofire + SwiftyJSON 加载到 UITableView

在 swift 4.0 中使用 Alamofire/SwiftyJSON 时出错

Swift 3 不能使用 SwiftyJSON 和 Alamofire 为“String”类型的值下标“String”类型的索引