简体   繁体   English

解析 JSON Swift TableView

[英]Parse JSON Swift TableView

I'd like to extract "Event", "Hasta" & "Location" from this JSON URL ( https://www.kimonolabs.com/api/7flcy3qm?apikey=gNq3hB1j0NtBdAvXJLEFx8JaqtDG8y6Y ), but I'm struggling with how to do it?我想从这个 JSON URL ( https://www.kimonolabs.com/api/7flcy3qm?apikey=gNq3hB1j0NtBdAvXJLEFx8JaqtDG8y6Y ) 中提取“事件”、“哈斯塔”和“位置”,但我正在努力解决如何做它? Can anyone help me?谁能帮我? Here's my code... I'd like to then populate a tableview with these 3.这是我的代码......然后我想用这三个填充一个tableview。

override func viewDidLoad() {
    super.viewDidLoad()

    splitViewController!.preferredDisplayMode = UISplitViewControllerDisplayMode.AllVisible

    UINavigationBar.appearance().barTintColor = UIColor(red: 52.0/255.0, green: 170.0/255.0, blue: 220.0/255.0, alpha: 1.0)
    UINavigationBar.appearance().tintColor = UIColor.whiteColor()
    UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName : UIColor.whiteColor()]

    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 = data {
                do {
                    let jsonResult = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary
                    if jsonResult!.count > 0 {
                        if let results = jsonResult!["results"] as? NSDictionary, collection2 = results["collection2"] as? NSArray {
                            for entry in collection2 {
                                if let dict = entry["Event"] as? NSDictionary {
                                    print(dict)
                                }

                                else if let array = entry as? NSArray {

                                } else {

                                }
                            }

                            if let items = jsonResult?["Date"] as? NSArray {
                                print(items)

                            }
                        }
                    }
                } catch {
                    print("In catch block")
                }
            }
        }
    }
    task.resume()
}

Parsing JSON with Swift is hell.用 Swift 解析 JSON 简直是地狱。 You can do that easily with SwiftyJSON .您可以使用SwiftyJSON轻松做到这一点

With your JSON:使用您的 JSON:

// Get content of json url
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 (key, 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 {
             print(hasta)
        }

        // Check if string for key "Location" exists
        if let location = subJson["Location"].string {
             print(location)
        }
    }
}

I created this online utility ( http://www.json4swift.com ) that transforms your json into swift representable models that you can manipulate as easily as this:我创建了这个在线实用程序 ( http://www.json4swift.com ),它将您的 json 转换为 swift 可表示的模型,您可以像这样轻松地操作:

// Get content of json url
let jsonString = try NSString.init(contentsOfURL: url!, encoding: NSUTF8StringEncoding)

// Create JSON Dictionary from data
            var jsonResult = NSJSONSerialization.JSONObjectWithData(jsonString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSDictionary

        //Create instance for base model representation
        let responseModel = Json4Swift_Base(dictionary: jsonResult)

        //print name
        print(responseModel!.name)

        //Get the collection2 from result
        let collection2 = responseModel?.results!.collection2

        //Get the first object from collection 2
        let firstObject = collection2?.first

        //Print the event and hesta
        print(firstObject?.event?.text)
        print(firstObject?.hasta)

In case of a tableview, you'll implement the delegate method cellForRowAtIndexPath在 tableview 的情况下,您将实现委托方法 cellForRowAtIndexPath

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    var cell = tableView.dequeueReusableCellWithIdentifier("YourCellIdentifier")

    if cell == nil {
        cell = UITableViewCell()
    }

    //Assuming you have responseModel instantiated earlier
    let collection2 = responseModel?.results!.collection2!

    //Get the n'th object from collection 2
    let object = collection2[indexPath.row]

    //Populate the cell the event and hesta
    cell.textLabel?.text =  object?.event?.text
    cell.detailTextLabel?.text = object?.hasta

    return cell
}

Disclaimer: Consider the above as more of a pseudo-code, not actually tested but gives you the idea about the handling.免责声明:将上述更多视为伪代码,未经实际测试,但为您提供有关处理的想法。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM