在 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,这取决于您。
希望对你有所帮助。
我正在尝试将 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,这取决于您。
希望对你有所帮助。