【问题标题】:Could not decode JSON - Expected to decode Int but found a string/data instead无法解码 JSON - 预期解码 Int 但找到了字符串/数据
【发布时间】:2019-12-06 03:55:34
【问题描述】:

我想获取一些 JSON 数据。我做了一个结构,但这个结构似乎不起作用。当我运行我的代码时,我会收到这个错误:

typeMismatch(Swift.Int, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "data", intValue: nil), CodingKeys(stringValue: "match", intValue: nil), _JSONKey(stringValue: "Index 0", intValue: 0), CodingKeys(stringValue: "time", intValue: nil)], debugDescription: "期望解码 Int 但找到了一个字符串/数据。",底层错误: 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
      ]
   }
}

【问题讨论】:

  • 而不是catchprint(error) 中的print(error.localizedDescription)real 错误会准确地告诉您哪里出了问题,甚至在哪里。并且不要将您的结构命名为Data。 Foundation 框架中有一个同名的结构体。
  • 打印错误时请执行if let error = error { print(error)} 以获得更详细的错误消息
  • 谢谢,这是一个愚蠢的错误。 JSON 数据是 String 而不是 Int。

标签: json swift struct decoder


【解决方案1】:

错误消息中的编码路径告诉您问题出在哪里(在datamatch、第一个数组条目中以及在键 time 下)。一旦您按照该编码路径到达 JSON 中的适当位置,您就会看到 typeMismatch 问题,即您将 time 定义为 Int?,但您的 JSON 有一个字符串 "HT"

【讨论】:

    猜你喜欢
    • 2019-02-15
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    相关资源
    最近更新 更多