SWIFT:我无法从 URL 中解析数据?

问题描述 投票:0回答:1

我正试图从一个 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))"
arrays json swift xcode url
1个回答
0
投票

看来你已经差不多了:)

你说

我把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,更具体的部分叫做。"选择使用编码键进行编码和解码的属性"

好运。

© www.soinside.com 2019 - 2024. All rights reserved.