我有一个名为 points.json 的JSON文件,以及一个类似于以下内容的读取函数:
private func readJson() { let file = Bundle.main.path(forResource: "points", ofType: "json") let data = try? Data(contentsOf: URL(fileURLWithPath: file!)) let jsonData = try? JSONSerialization.jsonObject(with: data!, options: []) as! [String:Any] print(jsonData) }
它行不通,有什么帮助吗?
您的问题是,您强制拆开值,并且在发生错误的情况下无法知道其来源。
相反,您应该处理错误并安全地打开可选组件。
正如@vadian在他的评论中正确指出的那样,您应该使用Bundle.main.url。
Bundle.main.url
private func readJson() { do { if let file = Bundle.main.url(forResource: "points", withExtension: "json") { let data = try Data(contentsOf: file) let json = try JSONSerialization.jsonObject(with: data, options: []) if let object = json as? [String: Any] { // json is a dictionary print(object) } else if let object = json as? [Any] { // json is an array print(object) } else { print("JSON is invalid") } } else { print("no file") } } catch { print(error.localizedDescription) } }
在Swift中进行编码时,通常!是一种代码味道。当然也有例外(IBOutlets和其他),但请尽量不要对!自己使用强制展开,而要始终安全地展开。
!