【发布时间】: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 文件。现在我将代码改回原来的格式。基本上我不确定我需要什么才能正确解开我的所有价值观。