首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSONDecoder无法解析映射列表

JSONDecoder无法解析映射列表
EN

Stack Overflow用户
提问于 2021-04-26 14:36:46
回答 1查看 288关注 0票数 0

我已经准备好一个简单的吉特布测试游乐场来演示我的问题:

我的Swift代码:

代码语言:javascript
复制
struct TopResponse: Codable {
    let results: [Top]
}
struct Top: Codable {
    let uid: Int
    let elo: Int
    let given: String
    let photo: String?
    let motto: String?
    let avg_score: String?
    let avg_time: String?
}

let url = URL(string: "https://slova.de/ws/top")!
let task = URLSession.shared.dataTask(with: url) {
    data, response, error in
    
    let decoder = JSONDecoder()
    guard let data2 = data,
          let tops = try? decoder.decode(TopResponse.self, from:
                                            data2) else { return }
    print(tops.results[4].given)
}
task.resume()

无法解析获取的JSON字符串,并且不打印任何内容。

请问这里有什么问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-26 15:05:29

你的密码怎么了?

代码语言:javascript
复制
try?

这是罪魁祸首。为什么?您忽略了decode(_:from:)引发的错误。--您忽略了错误,该错误可能会给您提供确切的原因,或者至少给出失败原因的提示。相反,编写一个适当的do { try ... } catch { ... }

所以:

代码语言:javascript
复制
guard let data2 = data,
      let tops = try? decoder.decode(TopResponse.self, from:
                                        data2) else { return }
print(tops.results[4].given)

=>

代码语言:javascript
复制
guard let data2 = data else { return }
do {
let tops = try decoder.decode(TopResponse.self, from: data2)
print(tops.results[4].given)
} catch {
    print("Got error while parsing: \(error)")
    print("With response: \(String(data: data2, encoding: .utf8))") //Just in case because I've seen plenty of code where expected JSON wasn't the one received: it was an error, doc changed, etc...
}

第一次打印的输出:

代码语言:javascript
复制
$>Got error while parsing: keyNotFound(CodingKeys(stringValue: "results", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: \"results\", intValue: nil) (\"results\").", underlyingError: nil))

修正:

代码语言:javascript
复制
struct TopResponse: Codable {
    let results: [Top]

    enum CodingKeys: String, CodingKey {
        case results = "data"
    }
}

或者用data重命名data

然后,下一个错误:

代码语言:javascript
复制
$>Got error while parsing: typeMismatch(Swift.String, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "data", intValue: nil), _JSONKey(stringValue: "Index 0", intValue: 0), CodingKeys(stringValue: "avg_score", intValue: nil)], debugDescription: "Expected to decode String but found a number instead.", underlyingError: nil))

从JSON中提取:

代码语言:javascript
复制
    "avg_score": 20.4

它不是一个String (它不是双引号之间的值),而是一个Double

修正:

代码语言:javascript
复制
let avg_score: String?

=>

代码语言:javascript
复制
let avg_score: Double?
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67268638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档