Swift中未知错误的提取与解码

Swift中未知错误的提取与解码,swift,swiftui,urlsession,jsondecoder,Swift,Swiftui,Urlsession,Jsondecoder,我试图获取数据并将其解码为结构,然后在列表中显示该数据。 我使用quicktype.io将JSON解析为Swift。这部分似乎还可以 struct Response: Codable { var results: [User] } struct User: Codable { let id: String let isActive: Bool let name: String let age: Int let company, email, ad

我试图获取数据并将其解码为结构,然后在列表中显示该数据。 我使用quicktype.io将JSON解析为Swift。这部分似乎还可以

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

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

struct Friend: Codable {
    let id, name: String
}
这是代码的其余部分,我尝试解码数据(错误发生的地方)。这里有一个链接到


您必须在类型
[User]
上解码,而不是
响应
。查看响应,您将看到顶级的
JSON
是一个
数组
,而不是
字典
。另外,更新代码以获得有意义的错误消息。使用
do try catch
语法,而不是
if let try?

func loadData() {
    guard let url = URL(string: "https://www.hackingwithswift.com/samples/friendface.json") else {
        print("Invalid URL")
        return
    }
    let request = URLRequest(url: url)
    URLSession.shared.dataTask(with: request) { data, response, error in
        if let data = data {
            do {
                let decoder = JSONDecoder()
                decoder.dateDecodingStrategy = .iso8601
                let users = try decoder.decode([User].self, from: data)
                DispatchQueue.main.async {
                    print(users)
                    self.users = users
                }
            } catch {
                print(error)
            }
        } else {
            // if we're still here it means there was a problem
            print("Fetch failed: \(error?.localizedDescription ?? "Unknown error")")
        }
    }.resume()
}

更新:此外,需要添加
dateDecodingStrategy
,以使解码正常工作。

错误是什么,而不是本地化描述?如果您有错误,为什么不添加一些基本的错误处理?将
try?
替换为
try
,并在catch块中打印错误
do{…}catch{print(error)}
同样,需要给出
datedecoding策略
。检查更新。这是错误:
typeMismatch(Swift.Double,Swift.DecodingError.Context(编码路径:[u JSONKey(stringValue:“Index 0”,intValue:0),编码键(stringValue:“registed”,intValue:nil)],debugDescription:“应该解码Double,但找到了一个字符串/数据。”,underyingerror:nil))
为了清楚起见,您应该在问题中添加错误消息。如果这是正确的,那么为什么QuickType.io建议使用响应结构?@JoakimDanielson我怎么知道?我只是检查了OP中的代码,并使其正确。QuickType不是福音,我想可能会犯错误。@JoakimDanielson QuickType没有犯错误,我认为OP在发布回复时犯了错误。为什么不等到OP改进问题并发布解码错误,任何查看json的人都会发现它与代码不匹配。这是我在注释dateDecodingStrategy时得到的错误:
typeMismatch(Swift.Double,Swift.DecodingError.Context(codingPath:[\u JSONKey(stringValue:“Index 0”,intValue:0),CodingKeys(stringValue:“registered”,intValue:nil)],debugDescription:“应解码双精度,但找到了一个字符串/数据。”,underyingerror:nil))
func loadData() {
    guard let url = URL(string: "https://www.hackingwithswift.com/samples/friendface.json") else {
        print("Invalid URL")
        return
    }
    let request = URLRequest(url: url)
    URLSession.shared.dataTask(with: request) { data, response, error in
        if let data = data {
            do {
                let decoder = JSONDecoder()
                decoder.dateDecodingStrategy = .iso8601
                let users = try decoder.decode([User].self, from: data)
                DispatchQueue.main.async {
                    print(users)
                    self.users = users
                }
            } catch {
                print(error)
            }
        } else {
            // if we're still here it means there was a problem
            print("Fetch failed: \(error?.localizedDescription ?? "Unknown error")")
        }
    }.resume()
}