ios - 需要解释一下 Swift 代码中的 JSON 解析

标签 ios 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! : 如果函数失败,使应用程序崩溃

第二个? 来自 Actor :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()

关于ios - 需要解释一下 Swift 代码中的 JSON 解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43444499/

相关文章:

swift - 从 autoID 节点中检索值

ios - Google Sheets iOS - 将文档映射到 SDK

ios - 在模态表单中自动滚动 UITableView

ios - 该应用程序已被终止。错误 "Could not find an application at the specified directory"

python - 存储评论数据 python 的最快方法

c# - Json 序列化类型对象时检测到循环引用

ios - Swift的String文档中 'Swift are Unicode correct and locale insensitive'是什么意思?

ios - 哪个布局约束具有同等优先级?

java - 哪种 Java Web 开发框架适用于 AJAX 应用程序?

ios - Swift 3 UIScrollview 不要求缩放