我已经准备好一个简单的吉特布测试游乐场来演示我的问题:

我的Swift代码:
struct TopResponse: Codable {
let results: [Top]
}
struct Top: Codable {
let uid: Int
let elo: Int
let given: String
let photo: String?
let motto: String?
let avg_score: String?
let avg_time: String?
}
let url = URL(string: "https://slova.de/ws/top")!
let task = URLSession.shared.dataTask(with: url) {
data, response, error in
let decoder = JSONDecoder()
guard let data2 = data,
let tops = try? decoder.decode(TopResponse.self, from:
data2) else { return }
print(tops.results[4].given)
}
task.resume()无法解析获取的JSON字符串,并且不打印任何内容。
请问这里有什么问题?
发布于 2021-04-26 15:05:29
你的密码怎么了?
try?这是罪魁祸首。为什么?您忽略了decode(_:from:)引发的错误。--您忽略了错误,该错误可能会给您提供确切的原因,或者至少给出失败原因的提示。相反,编写一个适当的do { try ... } catch { ... }。
所以:
guard let data2 = data,
let tops = try? decoder.decode(TopResponse.self, from:
data2) else { return }
print(tops.results[4].given)=>
guard let data2 = data else { return }
do {
let tops = try decoder.decode(TopResponse.self, from: data2)
print(tops.results[4].given)
} catch {
print("Got error while parsing: \(error)")
print("With response: \(String(data: data2, encoding: .utf8))") //Just in case because I've seen plenty of code where expected JSON wasn't the one received: it was an error, doc changed, etc...
}第一次打印的输出:
$>Got error while parsing: keyNotFound(CodingKeys(stringValue: "results", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: \"results\", intValue: nil) (\"results\").", underlyingError: nil))修正:
struct TopResponse: Codable {
let results: [Top]
enum CodingKeys: String, CodingKey {
case results = "data"
}
}或者用data重命名data。
然后,下一个错误:
$>Got error while parsing: typeMismatch(Swift.String, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "data", intValue: nil), _JSONKey(stringValue: "Index 0", intValue: 0), CodingKeys(stringValue: "avg_score", intValue: nil)], debugDescription: "Expected to decode String but found a number instead.", underlyingError: nil))从JSON中提取:
"avg_score": 20.4它不是一个String (它不是双引号之间的值),而是一个Double。
修正:
let avg_score: String?=>
let avg_score: Double?https://stackoverflow.com/questions/67268638
复制相似问题