我已经干了几天了。
我只是试图将我的项目从Swift 2转换为Swift 3,并且我已经修复了一些错误。
然而,我只剩下最后19条,所有这些都是同样的错误。
基本上,我对返回JSON对象的服务器有一个请求。
JSON对象的一侧有嵌套的对象。
我在谷歌上搜索和阅读了好几个小时,尝试着不同的东西,不幸的是,没有什么效果。
任何帮助都是非常感谢的。
(注:我在以前的问题中被要求张贴我已经尝试过的内容。
我不会在这里这样做,因为我已经尝试了很多不同的方法来解决这个问题)
错误:键入'Any‘没有下标成员
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问题:
任何帮助都是非常感谢的!
发布于 2016-10-05 19:31:50
好的,在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
}
}
}发布于 2016-10-04 19:12:07
你好,你可以试试这个:
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
}
}
}
}
}让我知道它是如何工作的,这样我们就可以弄清楚了:)
发布于 2016-10-05 22:20:01
您不应该转换为NSArray,而应该转换为[AnyObject]。当枚举一个NSArray时,在Swift 3中那个Any实际上没有下标。您将找到更多关于Any vs AnyObject 在标准库文档中的信息,以及将id视为Any vs AnyObject的Swift 3更改的基本原理将解释在这个迅速发展的建议中。
let inputData:Data = "{\"data\": [{\"id\":\"x\"},{\"id\":\"y\"},{\"id\":\"z\"}]}".data(using: .utf8)!
if let response = try JSONSerialization.jsonObject(with: inputData, options: []) as? [String:AnyObject],
let responseData = response["data"] as? [AnyObject]
{
for (index, item) in responseData.enumerated()
{
let id = item["id"] as! String
print(id)
}
}关于使用第三方库(如SwiftyJSON )进行JSON解析,您可能不喜欢第三方模块,但是上面的代码会在错误的输入(如果条目没有键"id“或者不是字符串)上崩溃。当然,像SwiftyJSON或Freddy这样的库是在Swift中编写健壮的JSON解析代码的唯一方法,但是Cocoa提供的工具肯定不是为了程序员的利益而使用Swift类型的系统,而且很容易对使用该API的错误输入感到自满,解析任务越复杂(解析任务很可能不应该真的崩溃您的程序,而应该报告为错误)。
https://stackoverflow.com/questions/39841527
复制相似问题