2014-12-13 59 views
1

我试图对象的JSON数组转换为一个字典的阵列,迅速和JSON:对象

我有这样的代码:

func load() { //this function is the first that is executed 

    getActivities { 
     (response) in 
     self.loadActivities(response as NSArray) 
    } 
} 

func getActivities(callback:(NSDictionary) ->()){ //the next url contains the json array of objects 
    request("http://localhost/llancaActivity/public/activity/getListJSON/0/2", callback: callback) 
} 

func request(url:String, callback:(NSDictionary) ->()){ 
    var nsURL : NSURL = NSURL(string: url)!; 

    let task = NSURLSession.sharedSession().dataTaskWithURL(nsURL){ 
     (data, response, error) in 
     var error: NSError? 
     var response = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &error) as NSDictionary; 

     callback(response); 
    } 

    task.resume(); 
} 


func loadActivities(activities:NSArray){ 
    for activity in activities { 
     println(activity["id"]); //<-- These line never is executed!!!! 
    } 
} 

如果我访问我的浏览器在未来的URL:http ://本地主机/ llancaActivity /公共/活动/ getListJSON/0/2

我有下一个响应:

[{"id":"3","title":"Confer\u00e8ncia de meteorologia \u201cEl canvi clim\u00e0tic\u201d","description":"Hora: 19h\nLloc: Sala de Confer\u00e8ncies de la Casa de Cultura","start_date":"2014-12-13","end_date":"2014-12-13","id_category":null},{"id":"4","title":"Espectacle a favor de la Marat\u00f3 de TV3","description":"Hora: 17h\nEntrada: la voluntat\nLloc: Sala d\u2019Actes de la Casa de Cultura\nOrganitza: Associaci\u00f3 de Puntaires de Llan\u00e7\u00e0\nCol\u00b7labora: Entitats i Associacions de Llan\u00e7\u00e0 i l\u2019Ajuntament de Llan\u00e7\u00e0","start_date":"2014-12-13","end_date":"2014-12-13","id_category":null}] 

请,对不起,我的英语...

+0

你检查过'response'和'error'变量吗?它们包含什么? – 2014-12-13 01:22:33

回答

0

随着swifty,你只需要发出下面的内容,类型的字典JSON数组转换为对象:

let data = "[{\"id\":\"3\",\"title\":\"Confer\u00e8ncia de meteorologia \u201cEl canvi clim\u00e0tic\u201d\",\"description\":\"Hora: 19h\nLloc: Sala de Confer\u00e8ncies de la Casa de Cultura\",\"start_date\":\"2014-12-13\",\"end_date\":"2014-12-13\",\"id_category\":null}" // .... and the rest of your JSON 
let json = JSON(data:data) 

现在JSON将有解析数据。

1

您试图返回JSON的字典表示形式,但它不是字典。这是一个数组。是的,这是一组字典,但这与简单字典完全不同。

所以JSON解析很简单:

let responseObject = NSJSONSerialization.JSONObjectWithData(data!, options: nil, error: &parseError) as NSArray 

集成到这一点你request功能,它看起来像:

func request(urlString: String, callback: (responseObject: NSArray?, error: NSError?) ->()) { 
    let url = NSURL(string: urlString)! 

    let task = NSURLSession.sharedSession().dataTaskWithURL(url) { 
     data, response, error in 

     if data == nil { 
      callback(responseObject: nil, error: error) 
     } else { 
      var parseError: NSError? 
      let responseObject = NSJSONSerialization.JSONObjectWithData(data!, options: nil, error: &parseError) as? NSArray 
      callback(responseObject: responseObject, error: parseError) 
     } 
    } 
    task.resume() 
} 

注:

  • 我改变封盖返回两个参数responseObjecterror(即调用者可以检测错误的方式),但这取决于你。

  • 我将NSJSONSerialization结果转换为NSArray而不是NSDictionary

  • 更准确地说,我实际上将它转换为可选数组(使用as?),因此它将优雅地处理任何分析错误。

或者,你可以把这个返回斯威夫特字典的斯威夫特阵列:

func request(urlString: String, callback: (responseObject: [[String: AnyObject]]?, error: NSError?) ->()) { 
    let url = NSURL(string: urlString)! 

    let task = NSURLSession.sharedSession().dataTaskWithURL(url) { 
     data, response, error in 

     if data == nil { 
      callback(responseObject: nil, error: error) 
     } else { 
      var parseError: NSError? 
      let responseObject = NSJSONSerialization.JSONObjectWithData(data!, options: nil, error: &parseError) as? [[String: AnyObject]] 
      callback(responseObject: responseObject, error: parseError) 
     } 
    } 
    task.resume() 
} 

显然,无论你改变request关闭到,你想要做同样的改变getActivities,但这应该是自我解释。