Swift中未知错误的提取与解码
我试图获取数据并将其解码为结构,然后在列表中显示该数据。 我使用quicktype.io将JSON解析为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
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()
}