如何获取JSON数据并将其显示在表视图单元格上

时间:2017-08-30 12:29:16

标签: json swift uitableview

我将JSON数据传递给此表视图控制器。如何获取JSON数据并将其显示在表视图单元格上?

当我打印passedData时,我收到以下输出:

["jobs": <__NSArrayM 0x17005d9d0>
({
    jobDate = "2017-08-31";
    jobEndTime = 1504144800;
    jobID = 87;
    jobTime = 1504137600;
},
{
    jobDate = "2017-08-31";
    jobEndTime = 1504173600;
    jobID = 89;
    jobTime = 1504170000;
}), 
"result": success, 
"message": Retrieve Sucessfully]

这是我使用的代码:

var passedData: [String: Any]!

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    guard let jobs = passedData["jobs"] as? [[String:Any]] else {return 0}
    return jobs.count
}

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

    let cell = tableView.dequeueReusableCell(withIdentifier: "jobCell", for: indexPath)

    // jobs[indexPath.row] display jobTime 

    return cell       
 }

2 个答案:

答案 0 :(得分:0)

这可以帮助您了解解析和使用您拥有的JSON数据所需的步骤。您可能需要创建一个超出此答案范围的自定义UITableViewCell。网上有大量资源可以解释这一过程。

您还需要将时间戳转换为日期,StackOverflow上有很多答案可以帮助解决这个问题。像this one

一样

映射JSON数据

let passedJsonStr = "{\"jobs\":[{\"jobDate\":\"2017-08-31\",\"jobEndTime\":1504144800,\"jobID\":87,\"jobTime\":1504137600},{\"jobDate\":\"2017-08-31\",\"jobEndTime\":1504173600,\"jobID\":89,\"jobTime\":1504170000}],\"result\":\"success\",\"message\":\"Retrieve Sucessfully\"}"

struct Job {
    var jobDate: String
    var jobEndTime: Int
    var jobID: Int
    var jobTime: Int

    init(dict: [String:AnyObject]) {
        // unwrap these safely, I'm just giving an example
        self.jobDate = dict["jobDate"] as! String
        self.jobEndTime = dict["jobEndTime"] as! Int
        self.jobID = dict["jobID"] as! Int
        self.jobTime = dict["jobTime"] as! Int
    }
}

var jobs = [Job]()

if let data = passedJsonStr.data(using: String.Encoding.utf8) {

    if let jsonObject = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String:AnyObject] {

        if let jsonData = jsonObject["jobs"] as? [[String:AnyObject]] {
            jobs = jsonData.map { Job(dict: $0) }
        }

        print(jobs)
    }
}

在UITableView中显示

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

    let cell = tableView.dequeueReusableCell(withIdentifier: "jobCell", for: indexPath)

    let job = self.jobs[indexPath.row]
    cell.titleLabel.text = job.jobDate

    return cell       
 }

答案 1 :(得分:0)

我会尝试帮助您了解您正在使用的域名,而不是就此主题给出回复。

您要检索的JSON响应包含一个数组(jobs),其中每个元素都是一个对象。实际上,JSON语法声明:

  

在JSON中,值必须是以下数据类型之一:

     
      
  • 一个字符串
  •   
  • 一个数字
  •   
  • 一个对象(JSON对象)
  •   
  • 一个数组
  •   
  • 布尔
  •   
  •   

如果您使用的是JSONSerialization类,那么您将拥有一个包含字典数组的字典。

像这样的简单代码段将为您提供该数组

if let jsonArray = jsonDict["jobs"] as? [[String: Any]] {
    print(jsonArray)
}

现在,为了访问该数组的元素,您可以执行以下操作:

let jsonArrayDict = jsonArray[0]
print(jsonArrayDict["jobTime"] ?? 0)

显然,此处的代码并非生产就绪,因为您需要注意应用程序可能发生的崩溃。

我真正建议的是使用可以传递到表格视图单元格的模型。这种方法有以下好处:

  • 避免使用选项
  • 记录您的代码
  • 对您的代码进行单元测试

这里有一个关于如何将JSON对象转换为特定模型的示例。在操场上跑步练习。

struct Job {
    let jobDate: String
    let jobEndTime: Int
    let jobID: Int
    let jobTime: Int
}

extension Job {
    init?(dict: [String: Any]) {
        guard let jobDate = dict["jobDate"] as? String,
            let jobEndTime = dict["jobEndTime"] as? Int,
            let jobID = dict["jobID"] as? Int,
            let jobTime = dict["jobTime"] as? Int else {
                return nil
        }
        self.jobDate = jobDate
        self.jobEndTime = jobEndTime
        self.jobID = jobID
        self.jobTime = jobTime
    }
}

extension Job: CustomStringConvertible {
    var description: String {
        return "Job: \(jobDate) \(jobEndTime) \(jobID) \(jobTime)"
    }
}

let jsonString = """
    {
        "jobs": [
            {
                "jobDate": "2017-08-31",
                "jobEndTime": 1504144800,
                "jobID": 87,
                "jobTime": 1504137600
            },
            {
            "jobDate2": "2017-08-31",
            "jobEndTime": 1504144800,
            "jobID": 87,
            "jobTime": 1504137600
            }
        ],
        "result": "success",
        "message": "Retrieve Sucessfully"
    }
"""

if let jsonData = jsonString.data(using: .utf8), let jsonObject = try? JSONSerialization.jsonObject(with: jsonData, options: []),
    let jsonDict = jsonObject as? [String: Any],
    let jsonArray = jsonDict["jobs"] as? [[String: Any]] {
    let jobs = jsonArray.flatMap { Job(dict: $0) }
    print(jobs)
} else {
    print("No Results")
}