【问题标题】:How to segue a JSON file in swift?如何在 swift 中搜索 JSON 文件?
【发布时间】:2017-07-26 22:07:00
【问题描述】:

我正在构建一个应用程序,人们需要在其中填写表格,然后它会创建一个 HTTP 帖子,其中 API 将向应用程序返回一个包含我需要的数据的 Json 文件。访问 API 一切正常,但是我想在另一个视图控制器中解析数据。如何从另一个视图控制器访问 JSON 文件?

let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in

        guard error == nil else {
            return
        }

        guard let data = data else {
            return
        }

        do {
            //create json object from data
            if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] {


                print(json)

 ^^^^^^^
 How do I take this JSON file to the next view controller so I dont have to do the parsing below?



                let jsonData = json

                let ratesJson = jsonData["rates"]!

                let rates = ratesJson as! NSArray



                print("Rates: \(rates)")

                print("*************")
                print(rates.count)
                print("*************")


                for item in 0..<rates.count {
                    let specificRate = rates[item]
                    let price = (specificRate as AnyObject)["amount_local"]!
                    let provider = (specificRate as AnyObject)["provider"]!

                    print("--\(item)--")
                    print("Price: \(price!)")
                    print("Provider: \(provider!)")



                }

            }

        } catch let error {
            print(error.localizedDescription)
        }
    })

【问题讨论】:

  • 你如何展示你的另一种观点? o 提出请求的人和您要处理数据的人之间的关系是什么?
  • 如果您在任一类之外保存变量,则两个类都可以访问它。如果您有项目结构或对象,请在解析 json 时尝试存储项目数组。然后您就可以从任何其他 VC 访问它
  • 你在使用 Storyboard Segues 吗?已经回答(虽然在 objc 中):stackoverflow.com/questions/5210535/…

标签: arrays json swift nsdictionary


【解决方案1】:

根据您的评论,我假设您的意图实际上是将 JSON 对象而不是 JSON 文件传递​​给下一个视图控制器。

因此,您只需将 JSON 对象传递给您的 segue 并将其作为属性分配给下一个视图控制器。

由于问题是非常开放的,这里是一种可能的解决方案和解释。

例子:

//Sample snippet from code from question    
if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] {
    performSegue(withIdentifier: "MySegue", sender: json);
}

override func prepare(for segue: UIStoryboardSegue!, sender: Any?) {
    if (segue.identifier == "MySegue") {
       let vc = segue.destinationViewController as! RandomViewController
       vc.json = sender as! [String:Any];
    }
}

【讨论】:

  • 我猜你的意思是 vc.json = sender as! [String:Any],因为那是你在 performSegue 中发送的内容,而且 Swift 没有称为 JSON 的内置类型。
  • prepareForSegue 更名为prepare(for:sender:)
【解决方案2】:

通常会导致程序错误的事情之一是状态。在我看来,你在这里问的是状态。

我要做的是编写一个通用函数(Swift 在很多情况下鼓励函数式编程,看看:swift map, filter etc.,它处理 HTTP 请求并在闭包中返回数据。

然后这个闭包将存在于你想要你的 json 对象的视图控制器中,从而解决你访问所述数据的问题。

现在我也不认为这是正确的方法。我会为您返回的特定数据创建一个对象,例如“struct Person”或您需要的任何东西。

这有两个好处:

  • 在 swift 3.1 中,您可以使用自定义 init() 方法安全地解析 JSON(记住,可选!)并相应地填充结构数据
  • 在 swift 4.0Xcode9.0 中,您将能够变形刚刚创建的结构以符合 CodableDecodable 协议,其中 json 解析将大大简化,如下所述:@987654322 @

希望这对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 2018-12-10
    • 2016-01-06
    • 2019-08-11
    • 2018-09-02
    相关资源
    最近更新 更多