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

时间:2020-06-06 12:41:18

标签: json swift google-sheets swiftui

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

My JSON file structure

1 个答案:

答案 0 :(得分:0)

我相信您可以这样阅读此错误:

No value associated with key "totalmarketvalue"

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

您似乎只尝试解码PostTotal.Layer0

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

但是,您输入的JSON的根只有两个CodingKeys,分别是columnsrows。当您尝试仅解码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
    ...
}