我现在已经在这几天了。
我只是想把我的项目从Swift 2转换为Swift 3,我已经解决了很多错误。
但是,我是直到最后19,所有这些都是相同的错误。
基本上,我有一个返回JSON对象的服务器的请求。
该JSON对象在它的侧面有嵌套对象。我一直在谷歌搜索和阅读多个小时尝试不同的事情,不幸的是,没有任何工作。
任何帮助表示赞赏。
(注意:我已被问过以前的问题,发布我已经有的试过。
我不打算这样做,因为我尝试了很多不同的方法来解决这个问题。)
错误:输入'任何'没有下标成员
if let response = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject] {
if let data = response["data"] as? NSArray {
for (index, item) in data.enumerated() {
let id = item["id"] as! String
}
}
}
以下是我尝试过的一些事情:
if let response = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject] {
if let data = response["data"] as? NSArray {
for (index, item):[String:AnyObject] in data.enumerated() {
let id = item["id"] as! String
}
}
}
if let response = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject] {
if let data = response["data"] as? NSArray {
for (index, item) in data.enumerated() as? NSArray {
let id = item["id"] as! String
}
}
}
if let response = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject] {
if let data = response["data"] as? NSArray {
for item in data as? NSArray {
let id = item["id"] as! String
}
}
}
以上都没有解决问题。以下是我引用的SOF问题:
答案 0 :(得分:1)
你好你可以试试这个:
if let response = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSDictionary {
if let data = response["data"] as? [AnyObject] {
for (index, item) {
if let id = item["id"] as! String{
print(id)
}
}
}
}
或
let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
if let parseJson = json {
if let data = parseJson["data"] as? [AnyObject] {
for signleArray in data {
if let customObjects = signleArray as? [AnyObject] {
for customObject in customObjects {
let userId = customObject["id"] as! String
}
}
}
}
}
让我知道它是如何工作的,所以我们可以弄明白:)
答案 1 :(得分:1)
好吧,所以在经过0ndre_的帮助之后,我就是这样解决问题的方法。不幸的是,它不是多维/嵌套对象的完整修复,因此我不得不修改应用程序正在调用的API。
if let response = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary {
if let data = response["data"] as? [AnyObject] {
for (index, item) in data.enumerated() {
let id = item["id"] as! String
}
}
}
答案 2 :(得分:1)
您不应该转为NSArray
,而是[AnyObject]
。在枚举NSArray
时,在Swift 3中id
item type maps to Any
,它确实没有下标。您会在Any
与AnyObject
in the standard library documentation上找到更多相关信息,以及将id
视为Any
vs {{ 1}}解释为in this Swift evolution proposal。
AnyObject
关于使用第三方库(如SwiftyJSON进行JSON解析),您可能不喜欢第三方模块,但上面的代码会因输入错误而崩溃(如果项目没有密钥" id"或者如果它不是一个字符串)。它当然不像SwiftyJSON或Freddy这样的库是在Swift中编写健壮的JSON解析代码的唯一方法,但是Cocoa提供的工具当然不会使用Swift类型的系统来使程序员受益,而且#39 ;对于使用该API的错误输入容易自满,解析任务越复杂(这很可能不会导致程序崩溃,但应报告为错误)。