需要在Swift代码中解析JSON解析

问题描述:

我有以下方法可以在从开源端点解析基本json数据时正常工作。我的问题是,在纠正编译错误,我有以下行,我需要帮助理解:需要在Swift代码中解析JSON解析

let movieDictionary = json??["Search"] as! [[String:Any]] 

为什么我需要有“?” ?我想我需要'?'或'!',但为什么'??'?如果我删除其中一个'?'或者替换'??'用'!',Xcode坚持要添加另一个'?',然后我的代码编译。

我的全方法如下:

func fetchMovies() { 
      let url = NSURL(string: "http://www.omdbapi.com/?s=batman") 
      URLSession.shared.dataTask(with: url! as URL) { (data, response, error) in 

      if error != nil { 
       print(error) 
       return 
      } 

      do { 
       let json = try? JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? [String:Any]           
       let movieDictionary = json??["Search"] as! [[String:Any]] 

       for movie in movieDictionary { 
        print(movie["Title"]!) 
       } 

      } catch let jsonError { 
       print(jsonError) 
      }  
     }.resume() 
} 

第一?try?来了。当谈到一个抛出功能,你有3个选择把它写:

  • try:如果函数调用失败,转到catch
  • try?:如果函数调用失败,返回nil也不要去catch块。因此,返回类型为Optional<T>
  • try!:如果函数调用失败,崩溃的应用程序

第二?自投来了:as? [String:Any]。您要求编译器将其转换为[String: Any],如果它不是可转位的,则返回nil

如果你想摆脱他们两个:

let url = NSURL(string: "http://www.omdbapi.com/?s=batman") 
URLSession.shared.dataTask(with: url! as URL) { (data, response, error) in 
    guard error == nil else { 
     print(error!) 
     return 
    } 

    do { 
     guard let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? [String:Any] else { 
      print("Unexpected JSON format") 
      return 
     } 
     let movieDictionary = json["Search"] as! [[String:Any]] 

     for movie in movieDictionary { 
      print(movie["Title"]!) 
     } 

    } catch let jsonError { 
     print(jsonError) 
    } 
    }.resume() 
+0

非常感谢您的解决方案! – syedfa