2014-12-13 132 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,但這應該是自我解釋。