我在这里看了很多其他问题,但我对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“}]
答案 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)")
}