JSON解析迅速,始终捕获语句执行

Posted

技术标签:

【中文标题】JSON解析迅速,始终捕获语句执行【英文标题】:JSON Parsing swift, Always catch statement executing 【发布时间】: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 代码,因为可能还有其他问题。 我已将模型添加到问题中 【参考方案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个帖子

以上是关于JSON解析迅速,始终捕获语句执行的主要内容,如果未能解决你的问题,请参考以下文章

Mantle:解析 JSON 时未捕获的异常“NSInvalidArgumentException”

kafkaStream解析json出错导致程序中断的解决方法

在 JSON.parse 期间在节点中捕获异常

Alamofire中的responseJSON json解析

快速解析从 API 以 JSON 形式返回的对象

浅析 eval 解析json