我正在构建一个应用程序,人们需要填写表单,然后创建一个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)
}
})
答案 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;或者你的需求。
这有两个好处:
3.1
中,您可以使用自定义init()
方法安全地解析JSON(请记住,选项!)并相应地填充结构数据4.0
和Xcode9.0
中,您将能够将刚刚创建的结构变形为符合Codable
和Decodable
协议,而json解析将会大大增加简化,如下所述:ultimate swift json guide 希望这有任何帮助。