debugDescription:“预期对Array <Any>进行解码,但找到了字典。”,底层错误:无)

Bre*_*mte 2 json struct swift decodable

我想将在线json文件加载到我的应用程序中,但是遇到了以下错误:

typeMismatch(Swift.Array,Swift.DecodingError.Context(codingPath:[],debugDescription:“预期对Array进行解码,但找到了字典。”,底层错误:无))

我已经看过stackoverflow,但是其他解决方案并没有帮助解决我的问题。

我的json

我的数据模型:

import Foundation

struct Initial: Codable {
    let copyright: String
    let totalItems: Int
    let totalEvents: Int
    let totalGames: Int
    let totalMatches: Int
    let wait: Int
    let dates: [Dates]
}

struct Dates: Codable {
    let date: String
    let totalItems: Int
    let totalEvents: Int
    let totalGames: Int
    let totalMatches: Int
    let games: [Game]
}

struct Game: Codable {
    let gamePk: Int
    let link: String
    let gameType: String
    let season: String
    let gameDate: String
    let status: Status
    let teams: Team
    let venue: Venue
    let content: Content
}

struct Status: Codable {
    let abstractGameState: String
    let codedGameState: Int
    let detailedState: String
    let statusCode: Int
    let startTimeTBD: Bool
}

struct Team: Codable {
    let away: Away
    let home: Home
}

struct Away: Codable {
    let leagueRecord: LeagueRecord
    let score: Int
    let team: TeamInfo
}

struct Home: Codable {
    let leagueRecord: LeagueRecord
    let score: Int
    let team: TeamInfo
}

struct LeagueRecord: Codable {
    let wins: Int
    let losses: Int
    let type: String
}

struct TeamInfo: Codable {
    let id: Int
    let name: String
    let link: String
}

struct Venue: Codable {
    let name: String
    let link: String
}

struct Content: Codable {
    let link: String
}
Run Code Online (Sandbox Code Playgroud)

这是我的viewcontroller

import UIKit

class TodaysGamesTableViewController: UITableViewController {
    var todaysGamesURL: URL = URL(string: "https://statsapi.web.nhl.com/api/v1/schedule")!

    var gameData: [Dates] = []
    let activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .gray)

    override func viewDidLoad() {
        super.viewDidLoad()
        loadTodaysGames()
    }

    func loadTodaysGames(){
        print("load Games")

        view.addSubview(activityIndicator)
        activityIndicator.frame = view.bounds
        activityIndicator.startAnimating()

        let todaysGamesDatatask = URLSession.shared.dataTask(with: todaysGamesURL, completionHandler: dataLoaded)

        todaysGamesDatatask.resume()
    }

    func dataLoaded(data:Data?,response:URLResponse?,error:Error?){
        if let detailData = data{
            print("detaildata", detailData)
            let decoder = JSONDecoder()
            do {
                let jsondata = try decoder.decode([Dates].self, from: detailData)
                gameData = jsondata //Hier .instantie wil doen krijg ik ook een error

                DispatchQueue.main.async{
                    self.tableView.reloadData()
                }
            }catch let error{
                print(error)
            }
        }else{
            print(error!)
        }
    }
Run Code Online (Sandbox Code Playgroud)

rma*_*ddy 7

JSON 由您的Initial结构表示,而不是Dates.

改变:

let jsondata = try decoder.decode([Dates].self, from: detailData)
Run Code Online (Sandbox Code Playgroud)

到:

let jsondata = try decoder.decode(Initial.self, from: detailData)
Run Code Online (Sandbox Code Playgroud)


vad*_*ian 5

请学习理解解码错误消息,这些消息非常具有描述性。

该错误表明您将解码数组,但实际对象是字典(目标结构)。

首先看一下JSON的开头

{
  "copyright" : "NHL and the NHL Shield are registered trademarks of the National Hockey League. NHL and NHL team marks are the property of the NHL and its teams. © NHL 2018. All Rights Reserved.",
  "totalItems" : 2,
  "totalEvents" : 0,
  "totalGames" : 2,
  "totalMatches" : 0,
  "wait" : 10,
  "dates" : [ {
    "date" : "2018-05-04",
Run Code Online (Sandbox Code Playgroud)

它以a开头,a {是字典(数组是[),但您要解码数组([Dates]),即错误消息所指的类型不匹配。


但这只是解决方案的一半。将行更改为后,try decoder.decode(Dates.self您将收到另一个错误,指出key没有值copyright

再次查看JSON,并将键与struct成员进行比较。成员与JSON键匹配的结构是Initial,您必须获取dates要填充的数组gameData

let jsondata = try decoder.decode(Initial.self, from: detailData)
gameData = jsondata.dates
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的协助!我现在遇到了一些 keyNotFound 错误,但我会尝试自己修复它们!我对 swift 比较陌生,所以欢迎任何帮助!再次感谢! (2认同)