无法从Google表格正确获取数据

陈enny

我设法从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
}

我的JSON文件结构

pawello2222

我相信您可以读取以下错误:

No value associated with key "totalmarketvalue"

这意味着解码器totalmarketvalue在您的响应中找不到密钥。

看来您PostTotal.Layer0只想解码

let postss = try! JSONDecoder().decode(PostTotal.Layer0.self, from: datas!)

但是,您输入的JSON的根只有两个CodingKeyscolumnsrows当您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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章