Не удалось декодировать JSON - ожидалось декодирование Int, но вместо этого обнаружена строка / данные

Я хочу получить данные JSON. Я создал Struct, но этот Struct, похоже, не работает. Когда я запускаю свой код, я получаю такую ​​ошибку:

typeMismatch (Swift.Int, Swift.DecodingError.Context (codingPath: [CodingKeys (stringValue: «данные», intValue: nil), CodingKeys (stringValue: «match», intValue: nil), _JSONKey (stringValue: «Index 0», intValue: 0), CodingKeys (stringValue: "time", intValue: nil)], debugDescription: "Ожидается декодирование Int, но вместо этого обнаружена строка / данные.", lowerError: nil))

Я новичок в JSON и Struct, поэтому не понимаю, что делаю не так. Я искал в Интернете похожие проблемы, но их решения, похоже, не помогли мне. Структура:

struct Data: Codable {
    var data: Match

    init(data: Match) {
        self.data = data
    }
}
struct Match: Codable {
    var match: [Live_Match]

    init(match: [Live_Match]) {
        self.match = match
    }
}

struct Live_Match: Codable {
    let competition_id: Int?
    let status: String?
    let ht_score: String?
    let ft_score: String?
    let et_score: String?
    let league_name: String?
    let away_id: Int?
    let score: String?
    let competition_name: String?
    let home_id: Int?
    let away_name: String?
    let time: Int?
    let home_name: String?
    let league_id: Int?

    init(competition_id: Int?, status: String?, ht_score: String?, ft_score: String?, et_score: String?, league_name: String?, away_id: Int?, score: String?, competition_name: String?, home_id: Int?, away_name: String?, time: Int?, home_name: String?, league_id: Int?) {
        self.competition_id = competition_id
        self.status = status
        self.ht_score = ht_score
        self.ft_score = ft_score
        self.et_score = et_score
        self.league_name = league_name
        self.away_id = away_id
        self.score = score
        self.competition_name = competition_name
        self.home_id = home_id
        self.away_name = away_name
        self.time = time
        self.home_name = home_name
        self.league_id = league_id
    }
}

Функция извлечения:

final let url_live = URL(string:"http://livescore-api.com/api-client/scores/live.json?key=6iNDEUYbh6NZHBdG&secret=RxkjBBp4h7MoKw2ROQvtLtE3zs2h4fXV&country=2")
    private var Live_Matches = [Live_Match]()

func downloadJson() {
        guard let downloadURL = url_live else { return }
        URLSession.shared.dataTask(with: downloadURL) { data, urlResponse, error in
            guard let data = data, error == nil, urlResponse != nil else {
                print(error?.localizedDescription)
                return
            }
            print("downloaded")
            do
            {
                let decoder = JSONDecoder()
                let downloadedLive_Matches = try decoder.decode(Data.self, from: data)
                print(downloadedLive_Matches)
                self.Live_Matches = downloadedLive_Matches.data.match
                DispatchQueue.main.async {
                    self.tableView.reloadData()
                }
            } catch {
                print(error.localizedDescription)
            }
            }.resume()
    }

JSON:

{
   "success": true,
   "data": {
      "match": [
         {
          "competition_id": 68,
          "status": "HALF TIME BREAK",
          "ht_score": "0 - 0",
          "ft_score": "",
          "et_score": "",
          "last_changed": "2019-07-28 16:52:14",
          "id": 151050,
          "league_name": "First Division A",
          "away_id": 806,
          "score": "0 - 0",
          "competition_name": "First Division A",
          "events": false,
          "home_id": 354,
          "away_name": "Gent",
          "added": "2019-07-28 15:45:20",
          "time": "HT",
          "home_name": "Sporting Charleroi",
          "league_id": 48
        }, //And some more data
      ]
   }
}

person Poephoofd Lol    schedule 28.07.2019    source источник
comment
Вместо print(error.localizedDescription) в catch блоке print(error). Настоящая ошибка сообщает вам, что именно не так и даже где. И не называйте свою структуру Data. В Foundation Framework есть структура с таким же именем.   -  person vadian    schedule 28.07.2019
comment
при печати ошибки сделайте if let error = error { print(error)}, чтобы получить более подробное сообщение об ошибке   -  person Joakim Danielson    schedule 28.07.2019
comment
Спасибо, это была глупая ошибка. Данные JSON были String вместо Int.   -  person Poephoofd Lol    schedule 28.07.2019


Ответы (1)


Путь кодирования в сообщении об ошибке сообщает вам, где проблема (в data, в match, в первой записи массива и под ключом time). Как только вы перейдете по этому пути кодирования в соответствующее место в JSON, вы увидите проблему typeMismatch, а именно то, что вы определили time как Int?, но в вашем JSON есть строка "HT".

person Rob    schedule 28.07.2019