【问题标题】:Unwrapping JSON from Itunes API - IOS App从 Itunes API 解包 JSON - IOS 应用程序
【发布时间】:2018-04-27 22:52:20
【问题描述】:

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

但是,我的答案永远不会显示在我的表格视图中,并且终端中总是显示错误:

"2017-11-14 17:25:28.809190+0100 iTunes 学习[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 学习[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 学习 [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()
}

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

【问题讨论】:

  • 首先指出导致错误的确切行。
  • BTW - 该错误声称您正在尝试将字典转换为数组。但是您发布的任何代码都没有尝试将任何内容转换为数组。有对字典和字符串的强制转换,但没有对数组的强制转换。因此,您的错误似乎来自代码中的其他地方。
  • 发生错误的确切行是:“let fetchedData = try JSONSerialization.jsonObject(with: data!, options: .mutableLeaves) as!NSArray”。对错误信息感到抱歉。我展示的一个来自之前的运行,我使用 NSArray 来解包 JSON 文件。现在我将代码改回原来的格式。基本上我不确定我需要什么才能正确解开我的所有价值观。

标签: json swift parsing itunes


【解决方案1】:

您的 JSON 数据不是数组。它是一个包含两个键/值对的字典。第一个是键“resultCount”,值为 50,第二个是键“results”,其值为数组。

永远不要用作!解析 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 {
           ...
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-05
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    相关资源
    最近更新 更多