解析对象数组并填充表格视图单元格 Swift

Posted

技术标签:

【中文标题】解析对象数组并填充表格视图单元格 Swift【英文标题】:Parse an Array of objects and populate table view cells Swift 【发布时间】:2015-08-19 13:00:22 【问题描述】:

我有一个应用程序,我试图从我创建的 API 中提取数据(该 API 基于 NODE.js、MongoDB、Express.js )

目前我正在尝试提取对象数组,然后基于该对象数组创建一个表格视图。例如,如果对象数组包含 4 个对象,那么表格视图将有 4 个单元格。在单击一个单元格时,我将转到另一个视图,在那里我可以查看该对象的详细视图。

如何解析从 API 返回的 JSON 数据并填充表格视图单元格?

我的问题:

目前我无法解析返回的对象数组。下面是返回的 JSON 包含的图像:

错误:

我收到以下错误:

Error could not parse JSON: Optional([
    
       "_id": "55d1db984f80687875e43f89",
       "password": "$2a$08$OQB/r9iIZdSFlN9L5vaiE.qILB8gP/YtlsA3S41usVnM/eXHBW9j6",
       "email": "syed.kazmi26@gmail.com",
       "__v": 0,
       "sector": "Manufacturing",
       "jobTitle": "Something 1",
       "employeeName": "Something 1"
    ,

   // it displays all the data being returned in JSON response

   ])

以下是我的 SWIFT 代码:

  import UIKit

  class SectorViewController: UIViewController 

  @IBAction func getManufacturingBios(sender: AnyObject) 

    var request = NSMutableURLRequest(URL: NSURL(string: "https://myURL/user/all")!)
    var session = NSURLSession.sharedSession()
    request.HTTPMethod = "GET"
    UIApplication.sharedApplication().networkActivityIndicatorVisible = true

    var err: NSError?

    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Accept")

    var task = session.dataTaskWithRequest(request, completionHandler: data, response, error -> Void in
        println("Response: \(response)")

        var strData = NSString(data: data, encoding: NSUTF8StringEncoding)

        println("Body: \(strData)")
        var err: NSError?
        var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves, error: &err) as? NSDictionary

        UIApplication.sharedApplication().networkActivityIndicatorVisible = true

        // Did the JSONObjectWithData constructor return an error? If so, log the error to the console
        if(err != nil) 

            println(err!.localizedDescription)
            let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding)
            println("Error could not parse JSON: '\(jsonStr)'")
            

        else 

            UIApplication.sharedApplication().networkActivityIndicatorVisible = false
            // The JSONObjectWithData constructor didn't return an error. But, we should still
            // check and make sure that json has a value using optional binding.

            if let parseJSON = json 

            // Okay, the parsedJSON is here, let's get the value for 'success' out of it

                var sector = parseJSON["sector"] as! String
                println("Succes: \(sector)")  

            
            else 
                // Woa, okay the json object was nil, something went worng. Maybe the server isn't running?
                let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding)
                println("Error could not parse JSON: \(jsonStr)")

            
        
    )

    task.resume()


【问题讨论】:

看起来就像您正在返回 JSONP(即 JSON 填充在一个名为 Optional 的函数中)。听起来对吗? @Andy 不,我的代码中没有名为 Optional 的函数。不知道如何解决这个问题。 【参考方案1】:

也许您可以尝试使用 NSArray 而不是 Dictionary 并更改阅读选项。我会建议做某事。像这样:

var json : NSArray? = nil    
json = (NSJSONSerialization.JSONObjectWithData(data, options:NSJSONReadingOptions.MutableContainers , error: &error) as? NSArray)!

希望能解决您的问题。

【讨论】:

哎呀没有看到你的答案。迟到了 2 分钟。 @Tobias 谢谢你的回答。您能建议如何更改阅读选项吗? 已经在我的帖子中改变了,看看 options 参数。我使用 MutableContainers 作为阅读选项。它指定将数组和字典创建为可变对象。【参考方案2】:

代替

var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves, error: &err) as? NSDictionary

应该是

var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves, error: &err) as? NSArray

因为您的响应内容是一个以 [ 开头的数组,实际上它的元素是 NSDictionary 类型。 如果是 [ ,请始终查找起始大括号。

JSON 数组以方括号开始和结束,JSON 字典以花括号开始和结束。

【讨论】:

感谢您的回答。进行更改后,我在以下行 var sector = parseJSON["sector"] as! 上收到以下错误“ AnyObject is not convertible to String ”!字符串 json 是一个数组,因此您必须遍历该数组。如果你需要第一个元素,那么你应该写let firstDict= parseJSON[0] as NSDictionary

以上是关于解析对象数组并填充表格视图单元格 Swift的主要内容,如果未能解决你的问题,请参考以下文章

填充 TableViewController

带有空单元格的表格视图

iOS - 使用 Swift 在每个表格视图单元格中获取 JSON 提要

通过标识符设置表格视图单元格高度 - Swift

parse.com swift - 在 tableView 单元格中取消固定和删除对象

在表视图中删除核心数据对象