2

我一直在尝试为我正在开发的应用程序找出数据持久性的最佳解决方案,我认为本地存储的 JSON 文件将是简单性和功能性的最佳平衡。

我需要保存的是一组自定义结构,我可以使用下面的代码很好地编写它,但是我无法将它解码回来,我收到了这个错误:

无法使用类型为“([Idea],来自:数据)”的参数列表调用“解码”

知道是什么原因造成的吗?想法数组本身是否应该是可编码的?编码它不应该工作,对吧?我做错了什么吗?

任何建议,将不胜感激。

var ideas = [Idea]()

--

struct Idea: Codable {
    var title: String
    var description: String?
    var date: String
    var completed: Bool
}

--

func writeIdeasToJSON(){
    let pathDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
    try? FileManager().createDirectory(at: pathDirectory, withIntermediateDirectories: true)
    let filePath = pathDirectory.appendingPathComponent("data.json")

    let json = try? JSONEncoder().encode(ideas)

    do {
        try json!.write(to: filePath)
    } catch {
        print("Failed to write JSON data: \(error.localizedDescription)")
    }
}

--

func readIdeasFromJSON(){
    do {
        let path = Bundle.main.path(forResource: "data", ofType: "json")
        let jsonData = try Data(contentsOf: URL(fileURLWithPath: path!))

        do {
            let readIdeas = try JSONDecoder().decode(ideas.self, from: jsonData)
            print(readIdeas)
        } catch let error{
            print(error.localizedDescription)
        }
    } catch let error {
        print(error.localizedDescription)
    }
}
4

1 回答 1

2

你有两个问题。首先是来自以下的编译器错误:

let readIdeas = try JSONDecoder().decode(ideas.self, from: jsonData)

那需要是:

let readIdeas = try JSONDecoder().decode([Idea].self, from: jsonData)

修复后,您会收到运行时错误,因为您将文件写入 Documents 文件夹,但您尝试从应用程序的资源包中读取它。

更新您的加载代码以使用用于保存文件的相同路径:

func readIdeasFromJSON(){
    do {
        let pathDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
        let filePath = pathDirectory.appendingPathComponent("data.json")

        let jsonData = try Data(contentsOf: filePath)
        let readIdeas = try JSONDecoder().decode([Idea].self, from: jsonData)
        print(readIdeas)
    } catch {
        print(error)
    }
}
于 2019-07-03T23:43:20.690 回答