解码后JSON数据为零

时间:2015-09-24 12:52:58

标签: ios json swift swift2

伙计我正在收到我做的api电话的回应。它返回整个响应,我把它给它的方法。

completionHandler(response: response, error: nil)

然后做

print(response.description)

结果是我获得了标题状态码等。

URL:
removed

Status Code:
200

Headers:
Keep-Alive: timeout=5, max=99
Content-Length: 2423
Server: Apache/2.4.10 (Debian)
SessionID: removed
Content-Type: application/json
Date: Thu, 24 Sep 2015 12:50:14 GMT
Connection: Keep-Alive
Cache-Control: no-cache

Payload:
[{"id":148,"name":"Amsterdam","avatar":"removed","cover":"removed"}]

我最感兴趣的部分是这部分

Payload:
[{"id":148,"name":"Amsterdam","avatar":"removed","cover":"removed"}]

不知怎的,我无法提取json对象的数组。有谁可以帮我解决这个问题?

编辑:添加了我收到回复并通过

传递的方法
func requestObj(url: Routes, params: Dictionary<String, String>?, completionHandler: (response: Response?, error: NSError?) -> ())
{
    self.requestConfig(completionHandler: { () -> () in
        if let req = NSMutableURLRequest(urlString: self.config!.api!.baseUrl! + "/v2" + url.rawValue) {
            do {
                req.addValue(String(self.config!.api!.token!), forHTTPHeaderField: "Token")
                req.addValue(String(self.sessionID), forHTTPHeaderField: "SessionID")
                let opt = HTTP(req)
                opt.start { response in
                    if let err = response.error {
                        print("error: \(err.localizedDescription)")
                        print("opt finished with error info: \(response.description)")
                        completionHandler(response: nil, error: nil)
                    }
                    completionHandler(response: response, error: nil)
                    //print("data is: \(response.data)") access the response of the data with response.data
                }
            }
        }
    }) // request a valid config before doing anything
}

调用
    adapter.requestObj(APIAdapter.Routes.getMunicipalities, params: nil, completionHandler: {(
        response, error) in
        if let response = response {
            print(response.description)
        }
    })

4 个答案:

答案 0 :(得分:1)

对于SwiftHTTP,您可以通过以下方式获取响应正文:

response.data

答案 1 :(得分:0)

你有没有尝试过&#34; SwiftyJson&#34;您可以将数据保存在JSON对象中,然后在此处以数据的形式访问数据

import Alamofire
import SwiftyJSON
 func RequestImages()
{
    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)
                debugPrint(data)
                self.Photos = self.ParseJSON(json)
                self.performSegueWithIdentifier("ToCollection", sender: self)
            case .Failure(_, let error):
                print("Request failed with error: \(error)")
            }       
    }
}

这里有一些代码,我使用一个名为Alamofire的库,我在JSON中检索响应,然后如果找到数据,我将数据保存在SwiftyJSON库提供的JSON对象中

let json = JSON(data)

然后我收集了一个&#34; Image&#34;模式称为&#34;照片&#34;我通过将JSON数据解析为以下

来填充此集合
 func ParseJSON(json:JSON)->[Image]
{
    //Get Image_URL
    var pictures = [Image]()
    for result in json["photos"].arrayValue
    {
        pictures.append(Image(url: result["image_url"].stringValue, name: result["name"].stringValue, news: result["description"].stringValue))
    }   
    debugPrint(pictures)
    return pictures

}

我希望我的实施可以帮助你问候!

答案 2 :(得分:0)

试试这个: -

override func viewDidLoad() {
    super.viewDidLoad()

  get_data_from_url("http://yourURL")


 }


func get_data_from_url(url:String) {

    let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()
    Id = label1.text //your request parameters 
    JId = label2.text //your request parameters 

    var post:NSString = "uid=\(Id)&jid=\(JId)"
    //NSLog("PostData: %@",post);

    var url:NSURL = NSURL(string: url)!

    var postData:NSData = post.dataUsingEncoding(NSASCIIStringEncoding)!

    var postLength:NSString = String( postData.length )

    var request:NSMutableURLRequest = NSMutableURLRequest(URL: url)
    request.HTTPMethod = "POST"
    request.HTTPBody = postData
    request.setValue(postLength as String, forHTTPHeaderField: "Content-Length")
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
    request.setValue("*/*", forHTTPHeaderField: "Accept")


    var reponseError: NSError?
    var response: NSURLResponse?

    var urlData: NSData? = NSURLConnection.sendSynchronousRequest(request, returningResponse:&response, error:&reponseError)


    if  urlData != nil && reponseError == nil {

        let res = response as! NSHTTPURLResponse!;

        //NSLog("Response code: %ld", res.statusCode);

        if (res.statusCode >= 200 && res.statusCode < 300) {

            var responseData:NSString  = NSString(data:urlData!, encoding:NSUTF8StringEncoding)!

            NSLog("Response ==> %@", responseData)

            if Id != nil {

            extract_json(urlData!)

            }



        } else {


            var alertView:UIAlertView = UIAlertView()
            alertView.title = "Sign in Failed!"
            alertView.message = "Connection Failed"
            alertView.delegate = self
            alertView.addButtonWithTitle("OK")
            alertView.show()

        }


    } else {


        var alertView:UIAlertView = UIAlertView()
        alertView.title = "Sign in Failed!"
        alertView.message = "Connection Failure"
        if let error = reponseError {
            alertView.message = (error.localizedDescription)
        }
        alertView.delegate = self
        alertView.addButtonWithTitle("OK")
        alertView.show()

    }

}

  func extract_json(data:NSData) { 

    var error: NSError?

    let jsonData:NSArray = NSJSONSerialization.JSONObjectWithData(urlData!, options:NSJSONReadingOptions.MutableContainers , error: &error) as! NSArray


    let Id_temp: AnyObject? = ((jsonData)[0] as! NSDictionary)["id"]
    let Name_temp: AnyObject? = ((jsonData)[0] as! NSDictionary)["name"]
}

首先访问此网站并验证您的网址

https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo?utm_source=chrome-app-launcher-info-dialog(GOOGLE扩展) 然后根据您的设置替换以下给定值: -

  request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
  request.setValue("*/*", forHTTPHeaderField: "Accept")

答案 3 :(得分:-2)

试试这个:

NSDictionary *jsonDictionary = [NSJSONSerialization JSONObjectWithData:response options:0 error:&error];

然后你可以[jsonDictionary objectForKey:@""]来检索值。

这是目标C,但我确信它在Swift中必须类似。