我在服务器中有一些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.")
}
答案 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)
}
}
}