如何在swift中删除JSON文件?

时间:2017-07-26 22:07:01

标签: arrays json swift nsdictionary

我正在构建一个应用程序,人们需要填写表单,然后创建一个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)
        }
    })

2 个答案:

答案 0 :(得分: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];
    }
}

答案 1 :(得分:0)

通常会导致程序错误的一个原因是状态。在我看来,你在这里问的是州。

我会做的是我会写一个泛型函数(Swift鼓励在很多情况下进行函数式编程,看看:swift map, filter etc.处理HTTP请求并返回数据关闭。

此闭包将存在于您希望json对象进入的视图控制器中,从而解决您访问所述数据的问题。

现在我也不相信这也是正确的方法。我会为你返回的特定数据创建一个对象,比如说&#34; struct Person&#34;或者你的需求。

这有两个好处:

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

希望这有任何帮助。