在swift中解析JSON的基础知识

时间:2017-01-29 19:30:03

标签: arrays json swift3

我正在尝试从我从URL http://jsonplaceholder.typicode.com/users获取的JSON文件中解析数据。然后我使用下面的代码,来自JSON的信息在控制台上打印出来自文件的所有信息。

let url = URL(string: "http://jsonplaceholder.typicode.com/users")
let task = URLSession.shared.dataTask(with: url!){ (data, response, error) in
        if error != nil
        {
            print("Error")
        }
        else
        {
            if let content = data
            {
                do
                {
                    let readableValues = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject
                    print(readableValues)

                    if let userInfo = readableValues[0] as? NSDictionary
                    {
                        if let Name = userInfo["name"]
                        {
                            print(Name)

                        }
                    }
                }
                catch{

                }
            }
        }
    }
    task.resume()
}

print(readableValues)将打印整个文件,print(Name)将打印字典中第一项的名称。我无法遍历可读的值来获取文件中的所有名称。 一旦我开始工作,那么我需要填充一个数组,这样我就可以将值放到tableview中,并将每个名称放在一个新行上。

1 个答案:

答案 0 :(得分:0)

每个JSON对象都是数组或字典。您从Web服务的发布者那里了解到这一点。在你的情况下,它是一个字典数组(可能包含自己的数组和字典):

class TableViewController: UITableViewController {
    var jsonValues = [[String: AnyObject]]()

    override func viewDidLoad() {
        super.viewDidLoad()
        let url = URL(string: "https://jsonplaceholder.typicode.com/users")

        let task = URLSession.shared.dataTask(with: url!){ (data, response, error) in
            if error != nil
            {
                print("Error")
            }
            else
            {
                if let content = data
                {
                    do
                    {
                        let jsonObject = try JSONSerialization.jsonObject(with: content, options: [])

                        // Check that your jsonObject is an array of dictionaries
                        // The code below provides a quiet exit. You may replace it with an
                        // exception throw
                        guard let readableValues = jsonObject as? [[String: AnyObject]] else {
                            print("Unexpected format")
                            return
                        }

                        print("Data loaded. Assign to instance's property")
                        self.jsonValues = readableValues

                        // Any method that updatins the UI should be called from the main thread
                        // Otherwise you will get delay in refreshing the table (you have to pull
                        // the table up or down first for it to refresh)
                        DispatchQueue.main.async {
                            self.tableView.reloadData()
                        }
                    }
                    catch {

                    }
                }
            }
        }
        task.resume()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

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

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") else {
            fatalError("Cannot find cell with identifier 'Cell'")
        }

        cell.textLabel?.text = jsonValues[indexPath.row]["name"] as? String
        return cell
    }
}