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

时间:2017-06-19 22:23:35

标签: ios json swift uitableview

我在这里看了很多其他问题,但我对Swift还是比较新的,我很难将这些答案放到我的上下文中。

我有一个事件数据库,我想用所述事件填充一个tableview。在我的'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”:“Magnificentsoirée”,“EventLocation”:“Hot tub cinema”,“StartDate”:“2017-12-01”},{“EventName”:“Splendid party”,“EventLocation” :“Gazeebo”,“StartDate”:“2017-12-02”},{“EventName”:“魔法事件”,“EventLocation”:“彩虹的尽头”,“StartDate”:“2017-02-03 “},{”EventName“:”稍微垃圾聚集“,”EventLocation“:”Dungeon“,”StartDate“:”2090-01-04“}]

1 个答案:

答案 0 :(得分:0)

首先是第一件事。您的print("1")不起作用的原因非常简单。您正在使用if let来解包该值,如果值为null,则会跳过if let内的代码。在您的代码中,只需为else添加if let并进行打印即可打印出来。

现在回到你的问题。您的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)")
}