【问题标题】:JSON Parsing swift, Always catch statement executingJSON解析迅速,始终捕获语句执行
【发布时间】:2020-07-01 14:17:33
【问题描述】:

我有 UITableViewController,我正在尝试从 url 解析数据, 始终捕获正在执行的语句,该语句在控制台中打印“某事”。 在 Storyboard 中,我将重用标识符添加到表格视图单元格中。

''' 类 TableViewController: UITableViewController {

final let url = URL(string: "http://jsonplaceholder.typicode.com/posts")
private var posts = [Post]()

override func viewDidLoad() {
    super.viewDidLoad()
    downloadJson()
}

func downloadJson() {
    guard let downloadURL = url else { return }
    URLSession.shared.dataTask(with: downloadURL) { (data, response, error) in
        guard let data = data, error == nil, response != nil else {
            return
        }
        
        do {
            let decoder = JSONDecoder()
            let tempPosts = try decoder.decode(Posts.self, from: data)
            print(tempPosts)
            self.posts = tempPosts.posts

            DispatchQueue.main.async {
                self.tableView.reloadData()
            }
        } catch {
            print("something")
        }
    }.resume()
}

// MARK: - Table view data source

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return posts.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
    cell.textLabel?.text = posts[indexPath.row].title
    return cell
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
}

} '''

'''

class Posts: Codable {
    let posts: [Post]
    
    init(posts: [Post]) {
        self.posts = posts
    }
}

class Post: Codable {
    let userId: Int
    let id: Int
    let title: String
    let body: String
    
    init(userId: Int, id: Int, title: String, body: String) {
        self.userId = userId
        self.id = id
        self.title = title
        self.body = body
    }

} '''

【问题讨论】:

  • print("something")=> print("Error while parsing: \(error)")。这是第一步(也是重要的一步)。
  • 添加您用于解析数据的 JSON 响应和 Posts 模型
  • 在看到 URL 上的 JSON 之后,我猜是 decoder.decode(Posts.self, from: data) => decoder.decode([Posts].self, from: data),但这是推测。我们也需要Posts 代码,因为可能还有其他问题。
  • 我已将模型添加到问题中

标签: json swift uitableview parsing cell


【解决方案1】:

如果Post 模型是,

struct Post: Codable {
    let userId, id: Int
    let title, body: String
}

在解析data时使用[Posts].self而不是Posts.self

let tempPosts = try decoder.decode([Post].self, from: data)

【讨论】:

  • 我已将模型添加到我的问题中,请检查
  • 谢谢,我只用了一个模型类
  • 这不是您为这种 JSON 格式制作 Codable 模型的方式。使用我在答案中添加的那个。
  • 你能帮我解析一下吗,如何只解析我从 URL 获取的 JSON 的前 30 个元素?
  • 使用let first30 = tempPosts[0..<30]可以获得前30个帖子
猜你喜欢
  • 1970-01-01
  • 2018-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多