在 Swift 中使用 JSON 对象填充表视图

Posted

技术标签:

【中文标题】在 Swift 中使用 JSON 对象填充表视图【英文标题】:Populating a Table View in Swift with a JSON object 【发布时间】:2017-06-19 22:23:34 【问题描述】:

我在这里查看了许多其他问题,但我对 Swift 还比较陌生,我很难将这些答案放到我所拥有的上下文中。

我有一个事件数据库,我想用所述事件填充一个表格视图。在我的“EventTableViewController”中,我有以下功能:

func HTTPRequestListEvent() 
    let serverURL = NSURL(string: "http://localhost:8888/public_php/Cake/index.php/event/listevent")
    let request = NSMutableURLRequest(url:serverURL! as URL)
    request.httpMethod = "POST"

    //Create a task to send the post request
    let task = URLSession.shared.dataTask(with: request as URLRequest) 
        data, response, error in

        if error != nil 
            print("HTTPRequestError1=\(error)")
            return
        

        do 
            if let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject] 
                print("1")
                for (_, value) in json 
                    if let eventItem = value as? [String:AnyObject] 
                        if let eventName = eventItem["EventName"] as? String 
                            print(eventName)
                        
                        if let eventLocation = eventItem["EventLocation"] as? String 
                            print(eventLocation)
                        
                    
                
            
        
        catch 
            print("HTTPRequestError2=\(error)")
        
    
    task.resume()

但是,我似乎无法让 JSON 序列化工作。它没有给我一个错误,甚至没有打印出'1'。

我也不想说'print(eventName)',但这就是我目前所知道的。我想做的是做类似的事情:

    cell.eventNameLabel.text = eventName

但我不确定如何在这种情况下获取单元格详细信息。

编辑:我的 JSON 曾在其他地方工作,但对于单一数据 - 我已经能够登录并注册用户。

使用邮递员,我从我的服务器获得以下 json 数据:

["EventName":"Magnificent soirée","EventLocation":"热水浴缸电影院","StartDate":"2017-12-01","EventName":"盛大派对","EventLocation" :"Gazeebo","StartDate":"2017-12-02","EventName":"神奇事件","EventLocation":"彩虹的尽头","StartDate":"2017-02-03 ","EventName":"有点垃圾的聚会","EventLocation":"Dungeon","StartDate":"2090-01-04"]

【问题讨论】:

您的 JSON 很可能不是字典。 你能添加一个 JSON 样本吗? @rmaddy 用外行的话来说是什么意思?我该如何处理这些信息? 您的代码假设 JSON 的顶层是字典。但是你的 JSON 的顶层是一个数组。 【参考方案1】:

第一件事。您的print("1") 不起作用的原因很简单。您正在使用 if let 解包该值,如果该值为 null,则将跳过您在 if let 中的代码。在您的代码中,只需为您的 if let 添加一个 else 并进行打印,这将被打印出来。

现在回到你的问题。您的 if let 不起作用的原因是您转换 JSON 字符串的方式。从您的 JSON 字符串来看,您在顶层有一个数组。在您的代码中,您将结果转换为[String:AnyObject],这是一个字典。所以你得到 null 作为结果,因为这个转换失败了。为了解决您的问题,这是您的代码的工作示例:

let str = "[\"EventName\":\"Magnificent soirée\",\"EventLocation\":\"Hot tub cinema\",\"StartDate\":\"2017-12-01\",\"EventName\":\"Splendid party\",\"EventLocation\":\"Gazeebo\",\"StartDate\":\"2017-12-02\",\"EventName\":\"Magical event\",\"EventLocation\":\"The end of a rainbow\",\"StartDate\":\"2017-02-03\",\"EventName\":\"Slightly rubbish gathering\",\"EventLocation\":\"Dungeon\",\"StartDate\":\"2090-01-04\"]"

do 
    let data = str.data(using: .utf8)
    if let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [Dictionary<String, Any>] 
        print("1")
        for oneItemInJsonArray in json 
            if let eventName = oneItemInJsonArray["EventName"] as? String 
                print(eventName)
            
            if let eventLocation = oneItemInJsonArray["EventLocation"] as? String 
                print(eventLocation)
            
        
    else
        print("fail")
    

catch 
    print("HTTPRequestError2=\(error)")

【讨论】:

以上是关于在 Swift 中使用 JSON 对象填充表视图的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 3 中使用 JSON 填充 TableView

从 Swift 中的 Json 响应中填充 TableSection

如何在 Swift 3 中用 JSON 数据填充表格?

在 Swift 2 和 Xcode 7 中使用来自 youtube 视频的 JSON 数据填充 UITableView

使用字典数据填充 UITableView (Swift)

使用 Json 图像 URL 调用 swift 填充 UITableView