Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用结构在Swift中解码Json:请告知?_Json_Swift_Jsondecoder_Swift Structs - Fatal编程技术网

使用结构在Swift中解码Json:请告知?

使用结构在Swift中解码Json:请告知?,json,swift,jsondecoder,swift-structs,Json,Swift,Jsondecoder,Swift Structs,我正在尝试使用Structs解码nfl球员的json文件,但在检查第一个球员的PlayerID(从不为null)后,它一直失败。我不确定我做错了什么,但我真的很感谢你的指导,我想我已经盯着这个看了整整24小时了 这是JSON文件的一个示例: 以下是我的结构: // MARK: PLAYERS.JSON STRUCTS struct playersArrayJSON: Codable { let lastUpdatedOn: String let players: Array&l

我正在尝试使用Structs解码nfl球员的json文件,但在检查第一个球员的PlayerID(从不为null)后,它一直失败。我不确定我做错了什么,但我真的很感谢你的指导,我想我已经盯着这个看了整整24小时了

这是JSON文件的一个示例:

以下是我的结构:

// MARK: PLAYERS.JSON STRUCTS
struct playersArrayJSON: Codable {
    let lastUpdatedOn: String
    let players: Array<nflPlayers>
    
    enum CodingKeys: String, CodingKey {
        case lastUpdatedOn = "lastUpdatedOn"
        case players = "players"
    }
}

struct nflPlayers: Codable {
    let playerID: Int
    let first: String
    let last: String
    let POS: String?
    let team: nflTeam?
    let imageSrc: String?
    let currentInjury: injury?
    
    enum CodingKeys: String, CodingKey {
        case playerID = "id"
        case first = "firstName"
        case last = "lastName"
        case POS = "primaryPosition"
        case team = "currentTeam"
        case imageSrc = "officialImageSrc"
        case currentInjury = "currentInjury"
    }
}

struct nflTeam: Codable {
    let teamID: Int
    let abbv: String
    
    enum CodingKeys: String, CodingKey {
        case teamID = "id"
        case abbv = "abbreviation"
    }
}

struct injury: Codable {
    let description: String
    let designation: String
    
    enum CodingKeys: String, CodingKey {
        case description = "description"
        case designation = "playingProbability"
    }
}
以下是我在控制台中得到的错误:

致命错误:“尝试!”表达式意外引发错误: Swift.DecodingError.keyNotFound(编码键(stringValue:“id”), intValue:nil),Swift.DecodingError.Context(编码路径: [CodingKeys(stringValue:players),intValue:nil), _JSONKey(stringValue:“索引0”,intValue:0)],debugDescription:“没有与键编码键关联的值(stringValue:“id”,intValue: nil)(“id”)。,underlineError:nil)):文件 CoachesChallenge/updateingvc.swift,第293行2020-10-09 18:08:08.412910-0700 CoachesChallenge[32143:2136162]致命错误: “试试看!”表达式意外引发错误: Swift.DecodingError.keyNotFound(编码键(stringValue:“id”), intValue:nil),Swift.DecodingError.Context(编码路径: [CodingKeys(stringValue:players),intValue:nil), _JSONKey(stringValue:“索引0”,intValue:0)],debugDescription:“没有与键编码键关联的值(stringValue:“id”,intValue: nil)(“id”)。,underlineError:nil)):文件 CoachesChallenge/updateingvc.swift,第293行


***非常感谢您的帮助和反馈!!!!提前谢谢你

怎么了?并发布一个JSON示例。一般情况下,不要使用
try?
隐藏错误-捕获错误并将其打印出来,以便了解问题所在was@NewDev我已将错误添加到帖子的底部。我看不到一个地方可以将实际的json文件上传到帖子??但是我在截图中捕获的snippit是我正在解码的文件。从有限的JSON示例中,您似乎缺少了一个结构:
players
是一个对象的
数组,每个对象的键都是:
player
teamAsOfDate
。您假定
players
[nflPlayers]
类型。(您可以通过创建一组新的编码键或
[String:nflPlayers].self来访问它)。查看示例代码的指导。您的对象也需要与JSON文件中的键具有相同的名称。如果我没弄错的话,Codable要求它们的名称相同。通常对于这种类型的设置,我建议将其更改为与JSON完全匹配,为每个对象创建一个包含基本类型的新结构。例如,您可以为一个结构创建一个汽车数组,但另一个结构定义了这些汽车、车轮数量、颜色等。@xTwisteDx不必将名称精确对齐,这是嵌套枚举的一部分:
func decodePlayersJSON() {
        // Get the players.json from docdir
        if let documentDirectory = FileManager.default.urls(for: .documentDirectory,
            in: .userDomainMask).first {
            let pathWithFileName = documentDirectory.appendingPathComponent("players.json")
            let fileUrl = URL(fileURLWithPath: pathWithFileName.path)
            do { // See if the players.json exist in docdir
                let data = try Data(contentsOf: fileUrl, options: .mappedIfSafe)
                // Exists in DocDir - Try decoding JSON and writing to jsonLocalArray
                if let searchResult: playersArrayJSON = try! JSONDecoder().decode(playersArrayJSON.self, from:data) {
                    jsonLocalArray = searchResult
                    print("Players.Json decoded successfully")
                    DispatchQueue.main.async {
                        self.lblDetails.text = "player's database updated successfully"
                        self.performSegue(withIdentifier: "toQuiz", sender: nil)
                    }
                    print(jsonLocalArray)
                } else {
                    print("Error decoding players.json.")
                }
            } catch {
                print("No data found when decoding players.json")
            }
        }
    }