2016-10-03 139 views
2

我一直在这里待了几天。
我只是试图将我的项目从Swift 2转换为Swift 3,并且修复了很多错误。
但是,我倒到了最后的19个,所有这些都是相同的错误。
基本上,我有一个请求返回一个JSON对象的服务器。
JSON对象在其一侧嵌套了对象。
我一直在谷歌和阅读多个小时尝试不同的事情,不幸的是,没有任何工作。
任何帮助表示赞赏。
(注:我已经被问过以前的问题,发布了什么我已经尝试
我不打算在这里做,因为我已经尝试了许多不同的方法来解决这个问题。)Swift:从Swift 2到Swift 3的转换失败

错误:键入“任意”有没有标会员

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问题:

  1. type any? has no subscript members
  2. Facebook SDK error for subscript members
  3. Type 'Any' has no subscript members (firebase)
  4. Type 'Any' Has no Subscript Members in xcode 8 Swift 3
  5. Type 'Any' has no subscript members after updating to Swift 3

任何帮助,不胜感激!

+0

不要把东西当作'NSArray'。使用swift类型并将其转换为'[[[String:String]]]'或其它类型。 – dan

+0

显示JSON,至少在'“data”:'后面有10个字符。 – vadian

回答

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 
     } 
    } 
} 
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 
       } 
      } 
      } 
     } 
     } 

只要让我知道它是如何工作,所以经过一些我们自己看着办吧:)

+0

这些选项都不起作用,但感谢您的尝试。我可能最终只需要实现SwiftJSON,我希望不必这样做。我不喜欢依赖第三方模块。 – recoilnetworks

1

您不应该投到NSArray,而是[AnyObject]。在枚举NSArray时,在Swift 3中表示id item type maps to Any,这确实没有下标。您会在Any vs AnyObjectin the standard library documentation上找到更多信息,并将此Swift 3更改为处理id的原因为AnyAnyObject的解释为in this Swift evolution proposal

 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输入,解析任务就越复杂(这很可能不会真的使程序崩溃,但应该报告为错误)。