【问题标题】:Issue with JSON Decoding? / How can I debug this?JSON解码问题? /我该如何调试?
【发布时间】:2023-03-24 18:40:01
【问题描述】:

我正在进行 API 调用并管理接收到的数据,但我的调用遇到了错误。这是我的 getData() 代码:

    func getData(from url: String) {
URLSession.shared.dataTask(with: URL(string: url)!, completionHandler: { data, response, error in
    guard let data = data, error == nil else {
        print("something went wrong.")
        return
    }

    do {
        self.instructionsResults = try JSONDecoder().decode([Step].self, from: data)
        print("getData() was successful!")
        print(self.instructionsResults)
    } catch {
        print("Decoding error:")
        print(String(describing: error)) // <-- this pings
    }
}).resume()
}

这是一个示例 url json 数据的 pastebin:link

这是我为此提取定义的结构:

struct Step: Codable {        
  let number: Int
  let step: String?
}

这可能是额外的,但我使用上面的调用来填充实例化为 var steps: [String] = [] 的数组,其中包含步骤:JSON 步骤数组中每个步骤的字符串数据。

for n: Int in 0 ..< instructionsResults.count {
        if instructionsResults[n].step != nil {
            let step = instructionsResults[n].step ?? "n/a"
            print("step: \(instructionsResults[n].step)")
            print("step: \(step)")
            steps.append(step)
        }
    }
    print("Steps: \(steps)")
}

有人对出了什么问题有任何见解吗?我的最终打印语句总是返回为空。我在这个项目的早期以类似的方式进行了类似类型的调用,并且效果很好,所以我很难理解我在哪里出错了。任何见解/反馈将不胜感激,谢谢。

编辑:这是错误代码:

Steps: []
Decoding error:
keyNotFound(CodingKeys(stringValue: "number", intValue: nil), Swift.DecodingError.Context(codingPath: [_JSONKey(stringValue: "Index 0", intValue: 0)], debugDescription: "No value associated with key CodingKeys(stringValue: \"number\", intValue: nil) (\"number\").", underlyingError: nil))

【问题讨论】:

    标签: arrays json swift struct


    【解决方案1】:

    错误表示顶层对象中没有键number

    请仔细阅读 JSON。您忽略了根级别的对象,即键为 steps 的数组。

    你需要这个

    struct Root: Decodable { 
        let steps: [Step]
    }
    
    struct Step: Decodable {        
        let number: Int
        let step : String
    }
    

    解码

    .decode([Root].self,
    

    【讨论】:

    • 嗨,这是有道理的。那么,我该如何访问 step 中每个 Step 的内容呢? / 你知道我可以从中找到的资源吗?感谢您的快速回复!
    • 这两个结构实际上代表了解码JSON的整个规则。 { 成为一个结构,[{ 成为一个结构的数组,双引号中的所有内容是Stringtrue/false(不是双引号)是Bool,浮点数(不是双引号)是Double,整数 Int。就是这样
    • 明白了,这是有道理的。我想我已经想通了..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 2020-03-25
    相关资源
    最近更新 更多