Разбор JSON Swift 4 - PullRequest
       13

Разбор JSON Swift 4

0 голосов
/ 25 сентября 2018

Вот JSON, который я пытаюсь проанализировать из API Strava:

{
"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
    }
]
}

Я пытаюсь получить доступ к некоторым записям и создать из них объект.Вот мой класс Athlete:

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)
   } 
}

Я пытаюсь проанализировать его с помощью этого кода:

let decoder = JSONDecoder()
let definition = try? decoder.decode(athlete.self, from: jsonData)

Я знаю, что я правильно получаю API и могу получить доступ к анализу всех полей, прежде чем"велосипеды", но я не могу получить доступ к велосипедам.С этим кодом происходит сбой decoder.decode ().Как правильно получить доступ к массиву и декодировать его?

1 Ответ

0 голосов
/ 25 сентября 2018

С вашим кодом все в порядке, кроме одной вещи.В вашем объявлении о байке измените

let distance: String

на

let distance: Int

Хорошо, теперь, когда я сказал это, я собираюсь взять вас на задание.Ваша последняя строка:

let definition = try? decoder.decode(athlete.self, from: jsonData)

Это очень глупо.Этот метод возвращает ошибку, сообщающую вам, в чем именно заключается проблема, и вы ее выбрасываете!Либо измените try? на try!, чтобы вызвать сбой, который будет регистрировать ошибку в консоли, либо измените его на try и поместите все это в блог try/catch и зарегистрируйте его самостоятельно:

do {
    let definition = try decoder.decode(athlete.self, from: jsonData)
} catch {
    print(error)
}

Вот так я и понял, какую ошибку ты совершил.Не потому что я умный.Не потому что у меня острые глаза.Ни то, ни другоеЭто потому, что я записал ошибку, а не выбрасывал ее, как вы.Если бы вы сделали это, вам бы не пришлось задавать этот вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...