如何在swift中读取文档目录中的json文件?

时间:2016-10-31 10:11:15

标签: ios json swift readfile

我在服务器中有一些JSON文件。我下载它们并将它们保存在文档目录中。但我无法读懂它们。 这是我的代码:

let documentsPath = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0])
    let textFileURL = documentsPath.appendingPathComponent("resource/data/introduction")
    let fileURLString = textFileURL?.path
    if FileManager.default.fileExists(atPath: (fileURLString)!){
        print("success")
    }
    if let path = Bundle.main.path(forResource: "test" , ofType: "json") {
        do {
            let data = try Data(contentsOf: URL(fileURLWithPath: path), options: .alwaysMapped)
            let jsonObj = JSONSerializer.toJson(data)
            print(jsonObj)
        } catch let error {
            print(error.localizedDescription)
        }
    } else {
        print("Invalid filename/path.")
    }

3 个答案:

答案 0 :(得分:0)

如果您更改此行:

let jsonObj = JSONSerializer.toJson(data)

到此:

let jsonObj = try JSONSerialization.jsonObject(with:data, options:JSONSerialization.ReadingOptions(rawValue:0))

代码应该有效。我不知道我突出显示的第一行来自哪里 - 也许您正在使用第三方库?如果是这样,您可能想提及您正在使用的内容,以便我们可以看到代码中的所有元素。

如果您使用的是标准的JSON序列化库并且代码是一个简单的输入错误或其他什么,您是否还可以提及您看到的错误或代码无效时会发生什么?

答案 1 :(得分:0)

有两种可能的情况:

A。如果您的项目中有多个具有相同名称的json文件,但是它们位于不同的目录中"Environment/production/myjsonfile.json""Environment/development/myjsonfile.json"):

  • 您必须指定目录Bundle.main.path(forResource: "myjsonfile", ofType: "json", inDirectory: "Environment/production")
  • 目录"Environment"应该作为Folder添加到您的主捆绑包(应用程序目标)中,并应显示在blue color中(黄色,当它作为一个组添加时) )。只需删除其引用并再次添加(请记住选择将其添加为文件夹而不是组)

B。如果您的项目中只有一种myjsonfile.json ,而不是仅使用Bundle.main.path(forResource: "myjsonfile", ofType: "json"),它将在您的主捆绑包(应用目标)中找到它。

答案 2 :(得分:-1)

我遇到了同样的问题,但研究和编写有关解决问题的信息,在这里我告诉你我的工作,我希望能帮到你。

import UIKit

class ViewController: UIViewController {


override func viewDidLoad() {
    super.viewDidLoad()

 //llamar metodo para descargar json
        descargar()

}

//------------------Descargar json--------------------------------------------------------  
func descargar() {

    //Create URL to the source file you want to download
    let fileURL = URL(string: "http://10.32.14.124:7098/Servicio.svc/getCentralesMovilJSON/")

    // Create destination URL
    let documentsUrl:URL =  FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first as URL!

    //agregar al destino el archivo
    let destinationFileUrl = documentsUrl.appendingPathComponent("centrales.json")

    //archivo existente???....................................................
    let fileExists = FileManager().fileExists(atPath: destinationFileUrl.path)

    let sessionConfig = URLSessionConfiguration.default
    let session = URLSession(configuration: sessionConfig)

    let request = URLRequest(url:fileURL!)

    // si el archivo centrales.json ya existe, no descargarlo de nuevo y enviar ruta de destino.........................................................................
    if fileExists == true {
        print("archivo existente")
        print(destinationFileUrl  )
        //llamar metodo para parsear el json............................................
        parseo()

    }

// si el archivo centrales.json aun no existe, descargarlo y mostrar ruta de destino..........................................................................
    else{
        print("descargar archivo")

    let task = session.downloadTask(with: request) { (tempLocalUrl, response, error) in
        if let tempLocalUrl = tempLocalUrl, error == nil {
            // Success se ah descargado correctamente...................................
            if let statusCode = (response as? HTTPURLResponse)?.statusCode {
                print("Successfully downloaded. Status code: \(statusCode)")
                print(destinationFileUrl)
                //llamar metodo para parsear el json............................................
                self.parseo()
            }

            do {
                try FileManager.default.copyItem(at: tempLocalUrl, to: destinationFileUrl)
            } catch (let writeError) {
                print("Error creating a file \(destinationFileUrl) : \(writeError)")
            }

        } else {
            print("Error took place while downloading a file. Error description: %@", error?.localizedDescription);
        }
        }
    task.resume()

    }}




//-----------------------------Extraer datos del archivo json----------------------------

func parseo(){

    let documentsUrl:URL =  FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first as URL!
    let destinationFileUrl = documentsUrl.appendingPathComponent("centrales.json")




    do {

        let data = try Data(contentsOf: destinationFileUrl, options: [])
        let centralArray = try JSONSerialization.jsonObject(with: data, options: []) as? [[String: Any]] ?? []

        print(centralArray)


    }catch {
        print(error)
    }

}

}