El análisis de los datos JSON de alamofire en una Matriz con el Diccionario

Estoy tratando de analizar los datos JSON de alamorefire de la siguiente manera.

import UIKit
import Alamofire
import SwiftyJSON

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        Alamofire.request(.GET, "https://api.mynexttrainschedule.net/")
            .responseJSON { response in
                guard let object = response.result.value else {
                    print("Oh, no!!!")
                    return
                }
                let json = JSON(object);print(json)
                let schedule = json[0]["schedule"]
        }
    }
}

Si puedo imprimir json, tengo una estructura de datos como la siguiente (se indica de manera concisa).

[
  {
    "schedule" : [
        {"departureTime" : "05:09", "destination" : "Boston", "trainType" : "Express"},
        {"departureTime" : "05:19", "destination" : "Portland", "trainType" : "Rapid"},
        {"departureTime" : "05:29", "destination" : "Boston", "trainType" : "Express""}
    ],
    "station" : "Grand Central",
    "direction" : "North"
  },
  {
    "schedule" : [
        {"departureTime" : "05:11","destination" : "Washington, "trainType" : "Express""},
        {"departureTime" : "05:23","destination" : "Baltimore, "trainType" : "Express""},
        {"departureTime" : "05:35","destination" : "Richmond, "trainType" : "Local""}
    ],
    "station" : "Grand Central",
    "direction" : "South"
  }
]

Ahora, ¿cómo puedo guardar la programación de la matriz con un diccionario (departureTime, destino…) a través de o no a través de SwiftyJSON?

Gracias.

ACTUALIZACIÓN

La siguiente es mi propia solución.

import Alamofire
import SwiftyJSON

class ViewController: UIViewController {
    var scheduleArray = [Dictionary<String,String>]()

    override func viewDidLoad() {
        super.viewDidLoad()

        Alamofire.request(.GET, "https://api.mynexttrainschedule.net/")
            .responseJSON { response in
                guard let object = response.result.value else {
                    print("Oh, no!!!")
                    return
                }
                let json = JSON(object)
                if let jArray = json.array {
                    if let westHolidayArray = jArray[0]["schedule"].array {
                        for train in westHolidayArray {
                            if let time = train["departureTime"].string,
                                let dest = train["destination"].string,
                                let type = train["trainType"].string {
                                let dict = ["time":time, "dest":dest, "type": type]
                                self.scheduleArray.append(d)
                            }
                        }
                    }
                }
        }
    }
}
InformationsquelleAutor El Tomato | 2016-11-18

3 Kommentare

  1. 6

    Primer lugar, usted debe crear una clase que es su modelo de Schedule como este

    class Schedule: NSObject {
      var departureTime: String
      var destination: String
      var trainType: String
    
      init(jsonDic : NSDictionary) {
          self.departureTime = jsonDic["departureTime"] != nil ? jsonDic["departureTime"] as! String! : nil
          self.destination = jsonDic["destination"] != nil ? jsonDic["destination"] as! String! : nil
          self.trainType = jsonDic["trainType"] != nil ? jsonDic["trainType"] as! String : nil
      }
    }

    Y en su vista controlador va a necesitar una matriz de la Schedule objeto y después de que usted podría analizar su Json se hace así:

    class ScheduleController: UIViewController {
    
        //The two object use to show the spinner loading
        var loadingView: UIView = UIView()
        var spinner = UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge)
    
        //Array of your objects
        var arrSchedule: [Schedule] = []
    
    
        override func viewDidLoad() {
            super.viewDidLoad()
            //Do any additional setup after loading the view, typically from a nib.
            self.getInfoSchedule()
        }
    
        func getInfoSchedule() {
            showActivityIndicator()
            Alamofire.request("https://api.mynexttrainschedule.net/", method: .get, parameters: nil, encoding: URLEncoding.default, headers: nil).responseJSON {
                response in
                self.hideActivityIndicator()
                switch response.result {
                case .success:
                    if let objJson = response.result.value as! NSArray? {
                        for element in objJson {
                            let data = element as! NSDictionary
                            if let arraySchedule = data["schedule"] as! NSArray? {
                                for objSchedule in arraySchedule {
                                    self.arrSchedule.append(Schedule(jsonDic: objSchedule as! NSDictionary))  
                                }
                            }
                        }
                    }
                case .failure(let error):
                    print("Error: \(error)")
                }
            }
        }
    
        //Those two method serves to show a spinner when the request is in execution
    
        func showActivityIndicator() {
            DispatchQueue.main.async {
                self.loadingView = UIView()
                self.loadingView.frame = CGRect(x: 0.0, y: 0.0, width: self.view.frame.width, height: self.view.frame.height)
                self.loadingView.center = self.view.center
                self.loadingView.backgroundColor = UIColor(rgba: "#111111")
                self.loadingView.alpha = 0.9
                self.loadingView.clipsToBounds = true
                self.spinner = UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge)
                self.spinner.frame = CGRect(x: 0.0, y: 0.0, width: 80.0, height: 80.0)
                self.spinner.center = CGPoint(x:self.loadingView.bounds.size.width / 2, y:self.loadingView.bounds.size.height / 2)
                self.loadingView.addSubview(self.spinner)
                self.view.addSubview(self.loadingView)
                self.spinner.startAnimating()
            }
        }
    
        func hideActivityIndicator() {
            DispatchQueue.main.async {
                self.spinner.stopAnimating()
                self.loadingView.removeFromSuperview()
            }
        }
    }

    Tal vez no es la manera más eficiente de hacerlo, pero a mí me funcionó. Estoy usando swift3 con xcode 8.1.

    Espero que ayude !

    • Gracias. ¿De dónde ‘dir’ como en auto.arrSchedule.append(Programación(jsonDic: dir como! NSDictionary)) vienen?
    • He actualizado mi respuesta fue objSchedule en lugar de dir lo siento
    • La aplicación se bloquea con el siguiente mensaje: nw_host_stats_add_src recv demasiado pequeño, recibido el 24 de espera 28 . Yo vi el mismo error un par de días. No recuerdo qué era, pero creo que me hizo cambiar a Swift 2.3 bajo Xcode 7.
    • Que versión de xcode que estaba utilizando ? Debido a que la versión 8.0 se ha montón de problemas. Tal vez podría ser la razón.
    • Me sale el error de arriba en Xcode 8.1. No tengo problemas con alamofire 3.5.1 bajo Xcode 7.3.1.
    • Así, normalmente, la lógica es la misma, sólo se debe cambiar el prototipo de la Alamofire.request. Déjeme saber si usted no puede resolver, y voy a tratar de adaptar el código con la versión de Xcode y Swift que usted tiene.
    • arrSchedule devuelve una matriz vacía.
    • Ha encontrado una solución ? Si no es el caso https://api.mynexttrainschedule.net/ es la API que te dan ese Json ?
    • He llegado con mi solución anterior. No, no es una dirección URL real.

  2. 1

    Básicamente lo que tenemos es una matriz de horarios. Puede asignar mediante ObjectMapper. Instalar su vaina y acaba de crear un nuevo Swift archivo. y Escribir este

    import ObjectMapper
    
    class TrainSchedules: Mappable {
    
    var mySchedules: [Schedules]
    
    required init?(_ map: Map) {
        mySchedules = []
    }
    
    func mapping(map: Map) {
        mySchedules             <- map["schedule"]
    }
    }
    
    
    class Schedules: Mappable {
    
    var departureTime: String
    var destination: String
    var trainType: String
    
    required init?(_ map: Map) {
    
        departureTime = ""
        destination = ""
        trainType = ""
    }
    
    func mapping(map: Map) {
    
        departureTime           <- map["departureTime"]
        destination             <- map["destination"]
        trainType               <- map["trainType"]
    
    }
    }

    Ahora se puede utilizar como

     if let data = Mapper<TrainSchedules>().map(json){
         //now data is an array containt=g all the schedules
         //access departureTimelike below
         print(data[0].departureTime)
     }

    Espero te sirva de ayuda, Letme saber si usted encuentra cualquier dificultad.

    • Gracias. Me sale un error en ‘.mapa’ (por encima de impresión). Dice que » No pueden invocar el ‘mapa’ con una lista de argumentos de tipo (JSON)
    • básicamente, tendrá que pasar su jsonObject (resultado de servicio) a la función
  3. -1
    Alamofire.request("YOUR_URL", method:.post, parameters:params, encoding:URLEncoding.default, headers: nil).responseJSON { response in
        switch(response.result)
        {
        case .success(_):
            if response.result.value != nil
            {
                let dict :NSDictionary = response.result.value! as! NSDictionary
                print(dict)
                let status = dict.value(forKey: "status")as! String
                print(status)
                if(status=="1")
                {
    
                    self.array_placeRequestId=((dict.value(forKeyPath: "result.request_id") as! NSArray).mutableCopy() as! NSMutableArray)
    
    
                }
                else
                {
                   print("Something Missed")
                }
            }
            break
    
        case .failure(_):
            print(response.result.error)
            break
        }
    }
    • Ya hay una solución si usted lee la pregunta con cuidado.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea