Swift从Application bundle之外的文件中读取json

时间:2016-09-20 19:51:35

标签: json swift nsdata nsurl

在发布这个相当简单的问题之前,我已经花了至少2个小时的时间。当json文件位于应用程序包内时,以下代码有效。

        if let file = Bundle.main.url(forResource: "data", withExtension: "json") {....

我正在以这种方式阅读json文件......

let myData = try Data(contentsOf: file as URL)

我无法从“/ Library / Application Support / AppFolder / data.json”访问该文件的相同副本。

以下不起作用

    let filepath = "/Library/Application Support/AppFolder/data.json"
    if let file = NSURL(string: filepath) {...

2 个答案:

答案 0 :(得分:1)

除了必须始终使用NSURL(fileURLWithPath...)创建文件系统中的URL之外,建议使用专用API检索特定系统文件夹:

let applicationSupportFolderURL = try! NSFileManager.defaultManager().URLForDirectory(.ApplicationSupportDirectory,
                                                               inDomain: .LocalDomainMask,
                                                      appropriateForURL: nil,
                                                                 create: false)
let jsonDataURL = applicationSupportFolderURL.URLByAppendingPathComponent("AppFolder/data.json")

或在Swift 3中(相当短)

let applicationSupportFolderURL = try! FileManager.default.url(for: .applicationSupportDirectory, 
                                                                in: .localDomainMask, 
                                                    appropriateFor: nil, 
                                                            create: false)
let jsonDataURL = applicationSupportFolderURL.appendingPathComponent("AppFolder/data.json")

答案 1 :(得分:0)

尝试:NSURL.init(fileURLWithPath: "your_path")

string:生成一个NSURL,表示给定的字符串。因此,字符串“http://www.google.com”和网址代表http://www.google.com

fileURLWithPath:获取路径,而不是URL,并使用file:// URL生成表示路径的NSURL。因此,如果您提供/foo/bar/baz,则网址将代表file:///foo/bar/baz