Convertir JSON a matriz en Swift 2

Necesito crear Arrays para una UITableView agrupada, con una línea de Título y detalle en cada celda de la tabla. Tengo mi salida json del server poniéndolo en la forma correcta para iterar a través de los methods UITableViewDataSource . ¿Pero cuál es la forma más simple de convertirlos en una matriz legible que las funciones de UITableView pueden hacer reference?

La matriz de encabezados es para los encabezados del grupo, por lo que es solo una matriz unidimensional. Puedo repetir eso. Los títulos y las matrices de detalles son bidimensionales. No puedo entender cómo hacerlo en Swift.

 "headings":["Tuesday, August 16, 2016","Wednesday, August 17, 2016","Thursday, August 18, 2016","Friday, August 19, 2016","Saturday, August 20, 2016","Sunday, August 21, 2016","Monday, August 22, 2016","Tuesday, August 23, 2016","Wednesday, August 24, 2016","Thursday, August 25, 2016","Friday, August 26, 2016","Saturday, August 27, 2016","Sunday, August 28, 2016","Monday, August 29, 2016","Tuesday, August 30, 2016","Wednesday, August 31, 2016","Thursday, September 1, 2016","Friday, September 2, 2016","Saturday, September 3, 2016","Sunday, September 4, 2016","Monday, September 5, 2016","Tuesday, September 6, 2016","Wednesday, September 7, 2016","Thursday, September 8, 2016","Friday, September 9, 2016","Saturday, September 10, 2016","Sunday, September 11, 2016","Monday, September 12, 2016","Tuesday, September 13, 2016","Wednesday, September 14, 2016","Thursday, September 15, 2016","Friday, September 16, 2016"], "titles":[["Joe Johnson"],["Joe Johnson"],["Sandy Primmell","Joe Johnson"],["Joe Johnson"],["Joe Johnson"],["Joe Johnson"],["Joe Johnson"],["Sandy Primmell","Joe Johnson"],["Joe Johnson","Joe Johnson"],["Sandy Primmell","Joe Johnson"],["Mark Greene","Joe Johnson"],["Joe Johnson"],["Joe Johnson"],["Joe Johnson"],["Joe Johnson"],["Sandy Primmell","Joe Johnson"],["Joe Johnson"],["Sandy Primmell","Joe Johnson"],["Mark Greene","Joe Johnson"],["Joe Johnson"],["Joe Johnson"],["Joe Johnson"],["Joe Johnson"],["Joe Johnson"],["Joe Johnson"],["Joe Johnson"],["Joe Johnson"],["Joe Johnson"],["Joe Johnson"],["Joe Johnson"],["Joe Johnson"],["Joe Johnson"]], "details":[["OFF"],["OFF"],["Gregory","OFF"],["Gregory"],["OFF"],["OFF"],["OFF"],["Weekday Rounders","OFF"],["Weekday Rounders","Night Owls"],["Gregory","OFF"],["Gregory","OFF"],["OFF"],["OFF"],["OFF"],["Gregory"],["Gregory","OFF"],["Gregory"],["Gregory","OFF"],["Gregory","OFF"],["OFF"],["OFF"],["OFF"],["OFF"],["OFF"],["OFF"],["OFF"],["OFF"],["OFF"],["OFF"],["OFF"],["OFF"],["OFF"]] 

ACTUALIZAR

Aquí está mi function asíncrona Alamofire que agarra los datos:

 manager.request(.POST, getRouter(), parameters:["dev": 1, "app_action": "schedule", "type":getScheduleType(), "days_off":getScheduleDaysOff(), "period":getSchedulePeriod(), "begin_date":getScheduleBeginDate(), "end_date":getScheduleEndDate()]) .responseString {response in print(response) var json = JSON(response.result.value!); // what I'm missing } 

Alternativamente, puede usar bibliotecas de análisis JSON como Argo o SwiftyJSON , que fueron creadas para simplificar el análisis JSON. Ambos están bien probados y manejarán casos extremos para usted, como parameters faltantes en las respuestas JSON, etc.

Un ejemplo con Argo:

Suponiendo que la respuesta JSON tiene este formatting (desde la API de Twitter )

 { "users": [ { "id": 2960784075, "id_str": "2960784075", ... } } 

1- Crea una class Swift para representar la respuesta

Tenga en count que Response es una class que contiene una matriz de User que es otra class que no se muestra aquí, pero obtiene el punto.

 struct Response: Decodable { let users: [User] let next_cursor_str: String static func decode(j: JSON) -> Decoded<Response> { return curry(Response.init) <^> j <|| "users" <*> j <| "next_cursor_str" } } 

2- Analice el JSON

 //Convert json String to foundation object let json: AnyObject? = try? NSJSONSerialization.JSONObjectWithData(data, options: []) //Check for nil if let j: AnyObject = json { //Map the foundation object to Response object let response: Response? = decode(j) } 

Un ejemplo con Swifty

Como se explica en la documentation oficial :

1- Convertir la cadena JSON en object SwiftyJSON

 if let dataFromString = jsonString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) { let json = JSON(data: dataFromString) } 

2- Elemento específico de acceso

Si los datos son una matriz, entonces usa el índice

 //Getting a double from a JSON Array let name = json[0].double 

Si los datos son un dictionary, entonces usa la tecla

 //Getting a string from a JSON Dictionary let name = json["name"].stringValue 

2'- Bucle sobre los elementos

Formación

 //If json is .Array //The `index` is 0..<json.count's string value for (index,subJson):(String, JSON) in json { //Do something you want } 

Diccionario

 //If json is .Dictionary for (key,subJson):(String, JSON) in json { //Do something you want } 

Puede usar esta function:

 func convertStringToDictionary(text: String) -> [String:AnyObject]? { if let data = text.dataUsingEncodi‌​ng(NSUTF8StringEncodi‌​ng) { do { return try NSJSONSerialization.JSONObjectWithData(data, options: []) as? [String:AnyObject] } catch let error as NSError { print(error) } } return nil } 

y luego puedes leer la matriz de esta manera:

 if let dict = convertStringToDictionary(jsonText) { let array = dict["headings"] as? [String] } 

Sugiero usar AlamofireObjectMapper. La biblioteca le permite mapear objects desde json fácilmente y, si se combina con Alamofire, puede lanzar y devolver su object en la respuesta del server. El mapeo de objects en sí debería verse así en su caso

 class CustomResponseClass: Mappable { var headings: [String]? requinetworking init?(_ map: Map){ } func mapping(map: Map) { headings <- map["headings"] } } 

De esta forma, desacopla la lógica de mapeo y análisis json de su tableViewController.

AlamofireObjectMapper

Parece que está obteniendo Dictionary from json y cada key contiene Array , puede intentar algo como esto, primero declare una instancia de Dictionary y use eso con los methods TableViewDataSource .

 var response = [String: AnyObject]() do { self.response = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! [String: AnyObject] print(dic) } catch let e as NSError { print(e.localizedDescription) } 

Ahora dentro de los methods tableView

 func numberOfSectionsInTableView(tableView: UITableView) -> Int { if let arr = self.response["headings"] as? [String] { return arr.count } return 0 } func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { let headings = self.response["headings"] as! [String] return headings[Int] } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if let arr = self.response["titles"] as? [[String]] { return arr[Int].count } return 0 } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let titles = self.response["titles"] as! [[String]] let details = self.response["details"] as! [[String]] let cell = tableView.dequeueReusableCellWithIdentifier("cell") as! EmployeeCell cell.mainLabel?.text = titles[indexPath.section][indexPath.row] cell.detailLabel?.text = details[indexPath.section][indexPath.row] return cell }