我设法在Swift中解析一些JSON,而且我有点挣扎。我需要从“Event”属性中提取“title”字符串。我有“Hasta”& “位置”,这对我(初学者)有好处。所以,现在我正在尝试使用这3个属性填充tableview。到目前为止,tableview是空的,并不显示我的信息。有帮助吗?请记住我是一个相对初学者 - 如此谨慎的解释将是受欢迎的。我一直在使用SwiftyJSON来解析JSON。我给了我的代码解释标记。作为参考,我有一个变量= var TableData = String。
let url = NSURL(string:"https://www.kimonolabs.com/api/7flcy3qm?apikey=gNq3hB1j0NtBdAvXJLEFx8JaqtDG8y6Y")!
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithURL(url) { (data, response, error) -> Void in
if error != nil {
print(error)
} else {
if let _ = data {
do {
let jsonString = try NSString.init(contentsOfURL: url, encoding: NSUTF8StringEncoding)
// Create JSON object from data
let json = JSON(data: jsonString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!)
// Check if array for key "collection2" exists
if let collection2 = json["results"]["collection2"].array {
// Create JSON array from it and loop for each object
for (_, subJson):(String, JSON) in JSON(collection2) {
// Check if dictionary for key "Event" exists
if let event = subJson["Event"].dictionary {
print(event)
}
// Check if string for key "Hasta" exists
if let hasta = subJson["Hasta"].string {
self.TableData.append(hasta)
//print(hasta)
}
// Check if string for key "Location" exists
if let location = subJson["Location"].string {
self.TableData.append(location)
//print(location)
}
}
}
} catch {
print("In catch block")
}
}
}
}
task.resume()
}
以下是我正在尝试填充表格(如下)。我意识到我需要制作一个带有3个标签的自定义单元格。但是现在,是否可以只使用3中的任何一个来填充tableview,只是为了看它是否有用。
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return self.TableData.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
cell.textLabel?.text = self.TableData[indexPath.row]
return cell
}
答案 0 :(得分:1)
你在这里做了一些不必要的事情。首先,您设置了一个从URL下载数据的任务。在完成块中,请求完成后,您将创建一个带有contentsOfURL
的字符串,该字符串再次调用相同的请求并将响应转换为字符串。然后从字符串创建NSData并将其传递给JSON()
以解析JSON字符串。但是您已经在完成块中获得了数据:
session.dataTaskWithURL(url) { (data, response, error) -> Void in
所以你可以转过身来:
let jsonString = try NSString.init(contentsOfURL: url, encoding: NSUTF8StringEncoding)
let json = JSON(data: jsonString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!)
进入这个:
let json = JSON(data: data)
但这还没有回答你的问题。当您将数据存储到TableData
时,您必须刷新TableView。所以在完成块结束时尝试调用
self.tableview.reloadData()
这应该是如何工作的(未经测试):
let url = NSURL(string:"https://www.kimonolabs.com/api/7flcy3qm?apikey=gNq3hB1j0NtBdAvXJLEFx8JaqtDG8y6Y")!
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithURL(url) { (data, response, error) -> Void in
if error != nil {
print(error)
} else {
if data != nil {
// Create JSON object from data
let json = JSON(data: data)
// Check if array for key "collection2" exists
if let collection2 = json["results"]["collection2"].array {
// Create JSON array from it and loop for each object
for (_, subJson):(String, JSON) in JSON(collection2) {
var data: [String : Any] = [String : Any]()
// Check if dictionary for key "Event" exists
if let event = subJson["Event"].dictionary {
data["event"] = event
}
// Check if string for key "Hasta" exists
if let hasta = subJson["Hasta"].string {
data["hasta"] = hasta
}
// Check if string for key "Location" exists
if let location = subJson["Location"].string {
data["location"] = location
}
self.TableData.append(data)
}
self.tableView.reloadData()
}
}
}
}
task.resume()