抓取JSON,解析成数组,打印在Swift

Fetch JSON, parse it into an array, and print it in Swift

我正在尝试从 API 中获取 json 数据,将其解析为一个结构数组,然后打印该数组。但是当我尝试打印出来时,只返回一个空白数组。我正在尝试了解如何为异步操作编写代码,但我不确定从这里该何去何从。有人可以指出我正确的方向吗? 我正在使用 Xcode 9、Swift 4.

在 Playgrounds 上进行尝试

import Foundation

struct Item: Decodable {
    var userId: Int?
    var id: Int?
    var title: String?
    var body: String?
}

var items = [Item?]()

let completionHandler = { (data: Data?, response: URLResponse?, error: Error?) in
        if error != nil {
            print("Error occured: \(error.debugDescription)")
        }
        
        let decoder = JSONDecoder()
        do {
            items = try decoder.decode([Item].self, from: data!)
            print(items)
        } catch {
            print("Error: Unable to fetch data")
        }
    }

func getJson() {
    let url = URL(string: "https://jsonplaceholder.typicode.com/posts")!
    let session = URLSession.shared
    let task = session.dataTask(with: url, completionHandler: completionHandler)
    task.resume()
    print(items)
}

getJson()

为了能够在 Playground 中 运行 异步内容,您必须添加

import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true

三个注意事项:

  1. resume 之后的 print 行毫无意义。它总是打印一个空数组。完成处理程序中的 print 行显示了真实结果
  2. 声明items

    var items = [Item]()
    

    JSONDecoder() returns 非可选的东西或抛出错误

  3. 这个特殊的 API 始终发送所有字段,因此您甚至可以将所有结构成员声明为非可选的

    struct Item: Decodable {
        var userId: Int
        var id: Int
        var title: String
        var body: String
    }