使用Swift从API解析JSON数据的问题
问题描述:
我试图从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
}
}
答
你JSON
响应Dictionary
不Array
和你正在寻找的阵列是,你需要从字典中获得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")
}
完美的,你非常,这是一个梦想。我认为这将是这样的,但因为我是新的迅速(字面上是最后几天)不知道的语法 –
@LewieClarke欢迎伴侣:) –