使用结构在Swift中解码Json:请告知?
我正在尝试使用Structs解码nfl球员的json文件,但在检查第一个球员的PlayerID(从不为null)后,它一直失败。我不确定我做错了什么,但我真的很感谢你的指导,我想我已经盯着这个看了整整24小时了 这是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
// 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")
}
}
}