我设法从Google表格中获取JSON数据,但这会导致致命错误:
致命错误:“尝试!” 表达式意外引发错误:Swift.DecodingError.keyNotFound(CodingKeys(stringValue:“ totalmarketvalue”,intValue:nil),Swift.DecodingError.Context(codingPath:[],debugDescription:“没有与键CodingKeys(stringValue:” totalmarketvalue相关联的值“,intValue:nil)(” 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
}
我相信您可以读取以下错误:
No value associated with key "totalmarketvalue"
这意味着解码器totalmarketvalue
在您的响应中找不到密钥。
看来您PostTotal.Layer0
只想解码:
let postss = try! JSONDecoder().decode(PostTotal.Layer0.self, from: datas!)
但是,您输入的JSON的根只有两个CodingKeyscolumns
和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
...
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句