2016-11-18 8 views
2

アラモアファイヤーからJSONデータを次のように解析しようとしています。アラモファイアからJSONデータを辞書付き配列にパースする

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

jsonを印刷すると、次のようなデータ構造があります(簡潔に説明します)。今

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

、私は経由かSwiftyJSONを通じて辞書(departureTime、目的地を...)スケジュール配列を保存することができますか?

ありがとうございました。次

UPDATEは私の独自のソリューションです。

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

答えて

1

基本的には、スケジュールの配列です。 ObjectMapperを使用してマップすることができます。ポッドをインストールし、新しいSwiftファイルを作成してください。この

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

} 
} 

今、あなたは

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

ようにそれを使用することができますを書く私はそれはあなたがどんな困難を見つけた場合Letmeが知っている、ことができます願っています。すべての

+0

ありがとうございました。私は '.map'(上の印刷)でエラーが発生します。それはあなたが基本的機能に –

+0

タイプ(JSON)の引数リストで 『マップ「を呼び出すことはできません』と言います。 self.arrSchedule.append(Schedule(jsonDic:dir as!NSDictionary))のように 'dir'はどこから来ましたか? –

3

まずあなたがこの

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

好きで、あなたのビューコントローラでScheduleのモデルであるクラスを作成する必要があり、あなたのScheduleオブジェクトの配列が必要になると、あなたのJSONあなた解析ができた後、次のようにしてください:

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

これはもっと効率的な方法ではないかもしれませんが、それは私のために働いています。私はxcode 8.1でswift3を使用しています。

希望すると助かります!

+0

感謝をあなたのjsonObject(サービスの結果を)渡す必要が –

+0

答えが 'dir'の代わりに' objSchedule'でした。申し訳ありません – Snoobie

+0

次のメッセージでアプリがクラッシュします:nw_host_stats_add_src recv too small、received 24、expected 28。私は数日間同じエラーを見た。私はそれが何だったのか覚えていませんが、Xcode 7のSwift 2.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 
    } 
} 
+1

あなたが質問を慎重に読んだら、すでに解決策があります。 –

関連する問題