我正试图从一个 url 中解析数据,但是我无法将对象添加到我的 games 数组中,我陷入了 debugprint("failed to parse data")。我的Game类继承自Codable,所以我真的不明白我错过了什么。
var games = [Game]()
func download(at url: String, handler: @escaping (Data?) -> Void)
{
// 1 - Create URL
guard let url = URL(string: url) else {
debugPrint("Failed to create URL")
handler(nil)
return
}
// 2 - Create GET Request
var request: URLRequest = URLRequest(url: url)
request.httpMethod = "GET"
// 3 - Create download task, handler will be called when request ended
let task = URLSession.shared.dataTask(with: request) {
(data, response, error) in handler(data)
}
task.resume()
}
func getGames() {
// 1 - Download games
download(at: "https://education.3ie.fr/ios/StarterKit/GameCritic/GameCritics.json")
{ (gameData) in
if let gameData = gameData {
// 2 - Decode JSON into a array of Game object
let decoder: JSONDecoder = JSONDecoder()
do {
self.games = try decoder.decode([Game].self, from: gameData)
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
catch {
debugPrint("Failed to parse data") // I fail here
}
}
else
{
debugPrint("Failed to parse data - error: \(error)")
}
}
}
override func viewDidLoad() {
getGames()
for elm in games
{
debugPrint(elm)
}
super.viewDidLoad()
}
我的类Game继承自Codable,所以我真的不明白我错过了什么。
"Failed to parse data - error: keyNotFound(CodingKeys(stringValue: \"small_path\", intValue: nil), Swift.DecodingError.Context(codingPath: [_JSONKey(stringValue: \"Index 0\", intValue: 0)], debugDescription: \"No value associated with key CodingKeys(stringValue: \\\"small_path\\\", intValue: nil) (\\\"small_path\\\").\", underlyingError: nil))"
看来你已经差不多了:)
你说
我把small_path换成了smallImageUrl。
但看看JSON从。https:/education.3ie.friosStarterKitGameCriticGameCritics.json。
这里有一个项目。
{
"id" : 0,
"name" : "Shenmue",
"smallImageURL" : "https://education.3ie.fr/ios/StarterKit/GameCritic/small0.jpg",
"bigImageURL": "https://education.3ie.fr/ios/StarterKit/GameCritic/big0.jpg",
"score": 16,
"platform": "dreamcast"
},
正确的名字是 smallImageURL
但在你的Swift Game
结构类中,你有一个叫做 smallImageUrl
(Url中的小写 "rl "与JSON中的大写 "RL "相比)。这对于 JSONDecoder
抛弃所有的希望和放弃......是的,真的! :)
所以,首先,试着把你的房产从以下位置改名为
smallImageUrl
到
smallImageURL
看看它能带你到哪里去。
如果你想为你的Swift变量使用一个与你收到的JSON变量不同的名字,比如说 smallImageUrl
而不是 smallImageURL
. 我鼓励你看看 文件 为EncodingDecoding,更具体的部分叫做。"选择使用编码键进行编码和解码的属性"
好运。