我正在尝试从我从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中,并将每个名称放在一个新行上。
答案 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
}
}