在 Alamofire 中将 JSON 转换为 NSData

Casting JSON to NSData in Alamofire

我正在尝试将 JSON 响应中的值转换为以下格式,但我一直在 Alamofire.request:

上收到错误

Cannot invoke 'responseJSON' with an argument list of type '((,,,)->)'

我确定它必须对 Alamofire.request() 之前初始化的变量做一些事情。另外我确定 return 将是 nil,我该如何解决?

func annotations() -> [TestAnnotation] {
    var annotations: [TestAnnotation] = []
    var points: NSDictionary = [:]
    var json: NSData?

    Alamofire.request(.GET, "http://192.168.0.10/test/globe.php", parameters:nil, encoding: .JSON) .responseJSON
        {
            (request, response, data, error) in

            json = JSON((data as? NSData)!)

    }
    for point in json["glimps"] as! NSArray {
        let lat = (point as! NSDictionary)["latitude"] as! CLLocationDegrees
        let lon = (point as! NSDictionary)["longitude"] as! CLLocationDegrees
        let gid = String(stringInterpolationSegment: (point as! NSDictionary)["id"])
        ///
        let coordinate1 : CLLocationCoordinate2D = CLLocationCoordinate2DMake(lat, lon)

        let a1: TestAnnotation = TestAnnotation(coordinate: coordinate1, title: gid)
        annotations.append(a1)
    }

    return annotations
}

这是我使用 Alamofire 处理 JSON 请求的方式,出于某种原因,我对 JSON 的 Alamofire 请求也是一个问题:

Alamofire.request(.GET, urlTo, parameters: nil, encoding: .URL).responseString(completionHandler: {
    (request: NSURLRequest, response: NSHTTPURLResponse?, responseBody: String?, error: NSError?) -> Void 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)
    }
})

但是根据你的问题你有问题,因为请求是 async 请记住这一点。这意味着您在 for 中的代码无法正常工作,因为它就在请求下方,如果需要,您可以按以下方式处理请求或仅在完成处理程序中处理:

func makeRequest(url : String, params : [String : String]?, completionHandler: (responseObject: JSON?, error: NSError?) -> ())  -> Request? {

    return Alamofire.request(.GET, url, parameters: params, encoding: .URL)
        .responseString { request, response, responseBody, error in completionHandler(
            responseObject:
            {
                // JSON to return
                var json : JSON?

                if let response = responseBody {                        
                    // Parse the response to NSData
                    if let data = (response as NSString).dataUsingEncoding(NSUTF8StringEncoding) {
                        json = JSON(data: data)
                    }
                }

                return json

                }(), error: error)
    }
}

然后您可以通过以下方式调用它:

self.makeRequest("url", params: nil) { json, error in            

     //handle the error here if you want before

     println(json)            
}

我强烈建议您使用 SwiftyJSON 更好更轻松地管理 JSON,这取决于您。

希望对你有所帮助。