抓取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
三个注意事项:
resume
之后的 print
行毫无意义。它总是打印一个空数组。完成处理程序中的 print
行显示了真实结果
声明items
为
var items = [Item]()
JSONDecoder()
returns 非可选的东西或抛出错误
这个特殊的 API 始终发送所有字段,因此您甚至可以将所有结构成员声明为非可选的
struct Item: Decodable {
var userId: Int
var id: Int
var title: String
var body: String
}
我正在尝试从 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
三个注意事项:
resume
之后的print
行毫无意义。它总是打印一个空数组。完成处理程序中的print
行显示了真实结果声明
items
为var items = [Item]()
JSONDecoder()
returns 非可选的东西或抛出错误这个特殊的 API 始终发送所有字段,因此您甚至可以将所有结构成员声明为非可选的
struct Item: Decodable { var userId: Int var id: Int var title: String var body: String }