2016-11-18 4 views
2

Ich versuche, JSON-Daten von alamorefire wie folgt zu analysieren.Analysieren von JSON-Daten von Alamofire in Array mit dem Wörterbuch

Wenn ich json drucke, habe ich eine Datenstruktur wie folgt (kurz und knapp angegeben).

[ 
    { 
    "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" 
    } 
] 

Nun, wie kann ich den Zeitplan-Array mit einem Wörterbuch (Busabfahrtszeit, Ziel ...) durch oder nicht durch SwiftyJSON retten?

Danke.

UPDATE

Das folgende ist meine eigene Lösung.

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) 
          } 
         } 
        } 
       } 
     } 
    } 
} 

Antwort

1

Im Grunde haben Sie eine Reihe von Zeitplänen. Sie können es mit ObjectMapper zuordnen. Installieren Sie den Pod und erstellen Sie einfach eine neue Swift-Datei. und schreiben

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"] 

} 
} 

Jetzt können Sie es wie

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

verwenden Ich hoffe, es hilft, letme wissen, wenn Sie irgendwelche Schwierigkeiten finden.

+0

Danke. Ich erhalte einen Fehler bei '.map' (über Druck). Es heißt 'Kann' map 'mit einer Argumentliste vom Typ (JSON) –

+0

nicht aufrufen. Sie müssen Ihr jsonObject (Ergebnis des Dienstes) grundsätzlich an die Funktion –

3

Zunächst einmal sollten Sie eine Klasse erstellen, die Ihr Modell von Schedule ist wie dieser

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 
    } 
} 

Und in Ihrem View-Controller Ihr geht eine Anordnung des Schedule Objekt müssen und nachdem Sie Ihre Json analysieren könnten Sie tut es dies mag:

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() 
     } 
    } 
} 

Vielleicht nicht die effizientere Art und Weise ist, es zu tun, aber es funktioniert für mich. Ich benutze swift3 mit xcode 8.1.

Hoffe es hilft!

+0

übergeben. Danke. Woher kommt 'dir' wie in self.arrSchedule.append (Schedule (jsonDic: dir als! NSDictionary)) her? –

+0

Ich aktualisierte meine Antwort es war 'objSchedule' anstelle von' dir' sorry – Snoobie

+0

Die App stürzt mit der folgenden Meldung ab: nw_host_stats_add_src recv zu klein, erhielt 24, erwartet 28. Ich habe den gleichen Fehler ein paar Tage gesehen. Ich kann mich nicht erinnern, wofür es war, aber ich denke, das hat mich dazu gebracht, unter Xcode 7 zu Swift 2.3 zu wechseln. –

-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 
    } 
} 
+1

Es gibt bereits eine Lösung, wenn Sie die Frage sorgfältig lesen. –

Verwandte Themen