首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析JSON Swift 4

解析JSON Swift 4
EN

Stack Overflow用户
提问于 2018-09-24 23:19:03
回答 1查看 61关注 0票数 0

下面是我试图从Strava API中解析的JSON:

代码语言:javascript
复制
{
"firstname": "Evan",
"lastname": "Arthur",
"city": "",
"state": "",
"country": "",
"sex": "M",
"measurement_preference": "feet",
"ftp": 285,
"bikes": [
    {
        "id": "b4770368",
        "primary": true,
        "name": "Felt Disc",
        "resource_state": 2,
        "distance": 2528687
    }
]
}

我正在尝试访问一些条目并从它们创建一个对象。这是我的运动员班:

代码语言:javascript
复制
import Foundation

struct athlete: Codable{
    let firstName: String
    let lastName: String
    let sex: String
    let measurement: String

    enum CodingKeys: String, CodingKey {
         case firstName = "firstname"
         case lastName = "lastname"
         case sex = "sex"
         case measurement = "measurement_preference"
         case bikes = "bikes"
    }

    struct Bike: Codable {
         let name: String
         let distance: String
     //  enum CodingKeys: String, CodingKey{
     //     case name = "name"
     //     case distance = "distance"
     //  }
    }

    let bikes: [Bike]

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        self.firstName = try container.decode(String.self, forKey:      .firstName)
        self.lastName = try container.decode(String.self, forKey: .lastName)
        self.sex = try container.decode(String.self, forKey: .sex)
        self.measurement = try container.decode(String.self, forKey: .measurement)
        self.bikes = try container.decode([Bike].self, forKey: .bikes)
   } 
}

我试图用以下代码解析它:

代码语言:javascript
复制
let decoder = JSONDecoder()
let definition = try? decoder.decode(athlete.self, from: jsonData)

我知道我正在正确地检索api,并且我可以访问“自行车”之前的所有字段,但我不能访问自行车。使用此代码,decoder.decode()将失败。如何正确访问数组并对其进行解码?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-24 23:39:30

除了一件事外,您的代码都很好。在你的自行车宣言中,改变

代码语言:javascript
复制
let distance: String

代码语言:javascript
复制
let distance: Int

好吧,既然我已经说了,我要带你去任务。你的最后一行是:

代码语言:javascript
复制
let definition = try? decoder.decode(athlete.self, from: jsonData)

那真是太愚蠢了。此方法返回一个错误,告诉您问题是什么,而您正在抛出该错误!要么将try?更改为try!以强制发生将在控制台中记录错误的崩溃,要么将其更改为try,并将整个过程包装在try/catch博客中并自己记录:

代码语言:javascript
复制
do {
    let definition = try decoder.decode(athlete.self, from: jsonData)
} catch {
    print(error)
}

所以我才知道你犯了什么错。不是因为我聪明。不是因为我有锐利的眼睛。都不是真的!这是因为我记录了错误,而不是像你那样扔掉它。如果你这么做了,你一开始就不需要问这个问题了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52488561

复制
相关文章

相似问题

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