我设法从Google表格中获取JSON数据,但这会导致致命错误:
致命错误:“尝试!”表达式意外引发错误: Swift.DecodingError.keyNotFound(CodingKeys(stringValue: “ totalmarketvalue”,intValue:无), Swift.DecodingError.Context(codingPath:[],debugDescription:“否 与键CodingKeys(stringValue: “ totalmarketvalue”,intValue:无)(“ totalmarketvalue”)。“, 底层错误:nil)):文件
下面列出了我的结构和功能
struct PostTotal: Codable {
// let id = UUID()
var rows: [Layer0]
struct Layer0: Codable, Hashable {
var totalmarketvalue: String
var totaltodaysprofit: String
var todaysprofitpercent: String
var totalasset: String
var maxpurchasepower: String
}
}
func getTotalValue () -> String {
let urlTotal = URL(string: webstringtotal)
var results: String = ""
URLSession.shared.dataTask(with: urlTotal!) { (datas, _, _) in
let postss = try! JSONDecoder().decode(PostTotal.Layer0.self, from: datas!)
results = postss.totalasset
}
.resume()
print(results)
return results
}
答案 0 :(得分:0)
我相信您可以这样阅读此错误:
No value associated with key "totalmarketvalue"
这意味着解码器在您的响应中找不到totalmarketvalue
键。
您似乎只尝试解码PostTotal.Layer0
:
let postss = try! JSONDecoder().decode(PostTotal.Layer0.self, from: datas!)
但是,您输入的JSON的根只有两个CodingKeys,分别是columns
和rows
。当您尝试仅解码PostTotal.Layer0
时,它期望顶级的totalmarketvalue
键。
您必须解码整个JSON树,然后根据需要访问元素:
let postss = try! JSONDecoder().decode(PostTotal.self, from: datas!)
let layer0 = postss.rows
注释
如果您从某些外部资源中获取数据,则不能100%确定响应将包含此密钥。最好使用do-try
并在数据丢失的情况下处理错误。
请注意,您已经指定了totalmarketvalue
类型的String
:
"totalmarketvalue": "100" // this will parse correctly
"totalmarketvalue": 100 // this will fail
您还可以显式指定CodingKeys
的类型。这将使您可以将模型变量名称与响应模型分开。
struct: Layer0: Codable, Hashable {
enum CodingKeys: String, CodingKey {
case totalMarketValue = "totalmarketvalue"
...
}
var totalMarketValue: String
...
}