从Swift中的json文件读回数据的正确方法是什么?

时间:2017-01-10 16:40:51

标签: ios json swift3

我的本​​地磁盘上有一个.json数据文件。它采用以下格式:

{
"employees" [
{
"Name" : "John",
"Location" : "Austin",
"Age" : "30"
},
.....
],
.....
}

现在我想读取文件并将数据加载到UITableView中。我最初的想法是将数据放入一个数组并使用该数组填充表。但我无法找到正确的步骤来实现这一点。

到目前为止我尝试过的方法:

        let currentFileURL = URL(string: currentFileString)
        do {
            let currentData = try Data(contentsOf: currentFileURL!)

            let jsonData = try JSONSerialization.jsonObject(with: currentData, options:.allowFragments)

        //***********************************************************
        //How to proceed here? Or am I using the right methods above? 
        //***********************************************************              

            } catch {
             //catch the error here
            } 

感谢您的帮助!

保罗

3 个答案:

答案 0 :(得分:1)

最好的方法是创建自定义classstruct,并使用tableView方法使用该自定义类对象的数组。

class Employee {

    var name: String?
    var location: String?
    var age: Int?

    init?(dictionary: [String: String]) }
        if let name = employee["Name"], let location = employee["Location"], let ageStr = employee["Age"], let age = Int(ageStr) {
            self.name = name
            self.location = location 
            self.age = age
        }
        else {
            return nil
        }
    }
}

现在在Controller中声明一个Employee实例数组,并将该数组与tableView方法一起使用。

var employees = [Employee]()

//Initialize array 
do {
   let currentData = try Data(contentsOf: currentFileURL!)
   if let jsonArray = (try? JSONSerialization.jsonObject(with: currentData, options: [])) as? [[String: String]] {
       self.emplyees = jsonArray.flatMap({ Employee(dictionary: $0) })
   }
   //Reload the tableView
   self.tableView.reloadData()

现在只需将此数组与UITableView方法一起使用。

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.employees.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "ProductCell") as! CustomTableCell
    cell.lblName = self.employees[indexPath.row].name
    //set other details

    return cell
}

答案 1 :(得分:0)

if let employees = jsonData["employees"] as? [[String:String]] {
    for employee in employees {

        if let name = employee["Name"] {
            // Set employee name
        }

        if let location = employee["Location"] {
            // Set employee location
        }

        if let age = employee["Age"] {
            // Set employee age
        }
    }
}

答案 2 :(得分:0)

首先创建一个结构Employee和一个数据源数组

struct Employee {
    var title : String
    var location : String
    var age : String
}

var employees = [Employee]()

然后解析JSON。

重要提示:访问文件系统网址时,您必须在fileURLWithPath上使用URL

let currentFileURL = URL(fileURLWithPath: currentFileString)
do {
    let currentData = try Data(contentsOf: currentFileURL)
    let json = try JSONSerialization.jsonObject(with:currentData, options: []) as! [String:Any]
    let people = json["employees"] as! [[String:String]]
    for person in people {
        employees.append(Employee(title: person["Name"]!, location: person["Location"]!, age: person["Age"]!))
    }    
} catch let error as NSError {
    print(error)
}

由于json文件位于本地磁盘上,并且您负责内容,因此强制解包是安全的或显示设计错误。