2017-05-27 62 views
-1

我试图从API获取数据并将其转换为swift。我设法连接到API,并获取数据进入控制台,但是当我尝试解析数据时,我遇到了一个问题 - 下面是执行连接并解析数据的函数。使用Swift从API解析JSON数据的问题

我有线路的问题:

let fetchedData = try JSONSerialization.jsonObject(with: data!, options: .mutableLeaves) as! NSArray 

运行的应用程序(功能parseData()被内viewDidLoad()调用)时,控制台将产生以下它产生致命错误SIGABRT - Could not cast value of type '__NSDictionaryI' (0x103b7f288) to 'NSArray' (0x103b7ee28).

func parseData() { 

    let url = "https://api.***" 

    var request = URLRequest(url: URL(string: url)!) 

    let headers = [ 
     "user": "***", 
     "auth": "***" 
    ] 

    request.httpMethod = "GET" 
    request.allHTTPHeaderFields = headers 

    let configuration = URLSessionConfiguration.default 

    let session = URLSession(configuration: configuration, delegate: nil, delegateQueue: OperationQueue.main) 

    let task = session.dataTask(with: request) { (data, response, error) in 
     if (error != nil) { 
      print("Error") 
     } else { 
      do { 

       let fetchedData = try JSONSerialization.jsonObject(with: data!, options: .mutableLeaves) as! NSArray 

       for eachFetchedOpportunity in fetchedData { 

        let eachOpportunity = eachFetchedOpportunity as! [String : Any] 
        let opportunity = eachOpportunity["subject"] as! String 
        let startDate = eachOpportunity["starts_at"] as! String 

        self.fetchedOpportunitys.append(Opportunity(opportunityName: opportunity, startDate: startDate)) 

       } 

       print(self.fetchedOpportunitys) 

      } catch { 
       print("Error") 
      } 
     } 
    } 

    task.resume() 

} 

这是从我通过邮递员访问的服务器返回的数据的开始(我没有包括所有的数据,因为有些数据是私人的和不必要的)我相信我的问题可能在于这里存在字典和数组混合的事实,并且我不知道如何在这种情况下正确解析数据。

{ 
"opportunities": [ 
    { 
     "id": 3, 
     "store_id": 1, 
     "project_id": null, 
     "member_id": 5, 
     "billing_address_id": 5, 
     "venue_id": null, 
     "tax_class_id": 1, 
     "subject": "***", 
     "description": "", 
     "number": "00000000**", 
     "starts_at": "2017-05-27T08:00:00.000Z", 
     "ends_at": "2017-05-27T16:00:00.000Z", 
     "charge_starts_at": "2017-05-27T08:00:00.000Z", 
     "charge_ends_at": "2017-05-27T16:00:00.000Z", 
     "ordered_at": "2017-05-25T21:10:00.000Z", 
     "quote_invalid_at": null, 
     "state": 3, 
... 
... 
    } 
    ], 
    "meta": { 
    "total_row_count": 2, 
    "row_count": 2, 
    "page": 1, 
    "per_page": 12 
    } 
} 

回答

0

JSON响应DictionaryArray和你正在寻找的阵列是,你需要从字典中获得opportunities

do { 
    let fetchedData = try JSONSerialization.jsonObject(with: data!, options: []) as! [String:Any] 
    let opportunities = fetchedData["opportunities"] as? [[String:Any]] ?? [] 
    for opportunity in opportunities {  

     let subject = opportunity["subject"] as? String ?? "Default Subject" 
     let startDate = opportunity["starts_at"] as? String ?? "Default Date" 
     self.fetchedOpportunitys.append(Opportunity(opportunityName: subject, startDate: startDate)) 
    } 
} 
catch { 
    print("Error") 
} 
+0

完美的,你非常,这是一个梦想。我认为这将是这样的,但因为我是新的迅速(字面上是最后几天)不知道的语法 –

+0

@LewieClarke欢迎伴侣:) –