从 URL 加载 Codable 数据

Loading Codable data from URL

我正在构建一个应用程序来获取和显示来自 https://www.hackingwithswift.com/samples/friendface.json 的数据。

我创建了以下结构:

struct Response: Codable {
    var results: [User]
}

struct User: Codable {
    struct Friend: Codable {
        var id: String
        var name: String
    }
    
    var id: String
    var isActive: Bool
    var name: String
    var age: Int
    var company: String
    var email: String
    var address: String
    var about: String
    var regiestered: Date
    var tags: [String]
    var friends: [Friend]
}

let urlString = "https://www.hackingwithswift.com/samples/friendface.json"

然后我尝试使用这样的函数加载数据:

func loadData () {
        guard let url = URL(string: urlString) else {
            print("Invalid URL")
            return
        }
        let request = URLRequest(url: url)
        URLSession.shared.dataTask(with: request) { data, response, error in
            if let data = data {
                if let decodedResponse = try? JSONDecoder().decode(Response.self, from: data) {
                    DispatchQueue.main.async {
                        self.results = decodedResponse.results
                    }
                    return
                }
            }
            print("Fetch failed: \(error?.localizedDescription ?? "Unknown error")")
        }.resume()
    }

但是当 运行 应用程序时,我得到“未知错误”输出。我做错了什么?

您的代码中存在一些问题。 首先,您的用户 属性 中有错字。它应该注册而不是注册。 其次,您正在尝试解码 Response 而不是一组用户。 第三,您没有将 dateDecodingStrategy 设置为 iso8601。 第四,你忽略了错误。不用试试?捕获错误并检查您的解码器抛出的内容。


struct User: Codable {
    let id: String
    let isActive: Bool
    let name: String
    let age: Int
    let company: String
    let email: String
    let address: String
    let about: String
    let registered: Date
    let tags: [String]
    let friends: [Friend]
}

struct Friend: Codable {
    let id: String
    let name: String
}

do {
    let decoder = JSONDecoder()
    decoder.dateDecodingStrategy = .iso8601
    let users = try decoder.decode([User].self, from: data)
    // your code
} catch {
    print("Decode error:", error)
    return
}