从 Itunes API - IOS App 解包 JSON

Unwrapping JSON from Itunes API - IOS App

我的程序有问题。如果有人可以提供帮助,我将不胜感激。我已经尝试了数周来解析从 iTunes API 中获取的 JSON 文件 (itunes.apple.com/search?term=song+you+want+to+search&entity=songTrack).

但是,我的答案从未显示在我的表格视图中,并且终端中始终显示错误:

"2017-11-14 17:25:28.809190+0100 Itunes Learning[32409:6240818] [MC] 延迟加载 NSBundle MobileCoreServices.framework
2017-11-14 17:25:28.810264+0100 Itunes 学习[32409:6240818] [MC] 加载MobileCoreServices.framework
2017-11-14 17:25:28.823734+0100 Itunes Learning[32409:6240818] [MC] systemgroup.com.apple.configurationprofiles 路径的系统组容器是 /Users/cyprianzander/Library/Developer/CoreSimulator/Devices/D52FD9D5-B6E4-4CE0-99E4-6E0EE15A680D/data/Containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles
无法将“__NSDictionaryI”类型的值 (0x103b911d8) 转换为 'NSArray' (0x103b90d28)。
2017-11-14 17:25:29.875534+0100 Itunes Learning[32409:6240900] 无法将类型 '__NSDictionaryI' (0x103b911d8) 的值转换为 'NSArray' (0x103b90d28)。
(LLDB)“

JSON 文件大致是这样设置的:

{“resultCount” : 50, “results”: [ {“trackName”:”name”, ”artistName”:”name2”}, {“trackName”:”name3”, “artistName”:”name4”} ] }

(数组中的对象数组 - 意味着第一个对象在最外面)。

我用另一个 API 尝试了我的功能,它确实有效。我感觉发生这种情况的主要原因是 iTunes API JSON 文件非常复杂。它是数组中非常长的对象的分类,数组位于较小的对象列表中。但是,另一个只是对象数组。

这是我的代码:(我注意到在解析我需要的数据时出现问题。我唯一需要知道的是如何正确解包我的 JSON 文件)

func parseData(searchTerm: String) {
    fetchedSong = []
    let itunesSearchTerm = searchTerm.replacingOccurrences(of: " ", with: "+", options: .caseInsensitive, range: nil)
    let escapedSearchTerm = itunesSearchTerm.addingPercentEncoding(withAllowedCharacters: [])!
    let urlString = "https://itunes.apple.com/search?term=\(escapedSearchTerm)&entity=song"
    let url = URL(string: urlString)!
    URLSession.shared.dataTask(with: url) { (data, response, error) in
        if let error = error {
            // If there is an error in the web request, print it to the console
            print(error)
            return
        }

        else {
            do {
                let fetchedData = try JSONSerialization.jsonObject(with: data!, options: .mutableLeaves) as! NSArray
                print(fetchedData)
                for eachFetchedSong in fetchedData {
                    let eachSong = eachFetchedSong as! [String: Any]
                    let song = eachSong["trackName"] as! String
                    let artist = eachSong["artistName"] as! String
                    self.fetchedSong.append(songs(song: song, artist : artist))

                }
                self.SongTableView.reloadData()

            }
            catch {
                print("An error occured while decoding the JSON object")
            }

        }
    }.resume()
}

如果有人能帮助我,我会非常高兴,特别是因为我已经坚持了三个星期,不断尝试不同的技术(这个似乎是最成功的)。

您的 JSON 数据不是数组。它是一个有两个 key/value 对的字典。第一个是值为 50 的键 "resultCount",第二个是值为数组的键 "results"。

切勿使用 as!解析 JSON 时,因为如果您得到意外结果,这会使您的应用程序崩溃。不要使用 .mutableLeaves 除非你能向我们解释它的作用以及你为什么需要它。不要在 Swift 代码中使用 NSArray。

处理一个错误并导致其他错误崩溃是毫无意义的。我会写

if let fetchedDict = try? JSONSerialization(...) as? [String:Any], 
   let fetchedArray = fetchedDict ["results"] as? [[String:Any]] {
    for dict in fetchedArray {
        if let song = dict ["trackName"] as? String, 
           let artist = dict ["artistName"] as? String {
           ...
        }
    }
}