Skip to content

14.5 存储和读取Codable对象为JSON文件

在iOS开发中,使用文件系统存储数据是一种常见且强大的方法。特别是当你需要存储复杂的数据结构时,将 Codable 对象存储为 JSON 文件是一个非常棒的选择。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,并且易于解析和生成。让我们一起看看如何实现吧!🎉

存储 Codable 对象为 JSON 文件

首先,你需要一个符合 Codable 协议的对象。CodableEncodableDecodable 的组合,意味着你的对象可以被编码成 JSON 数据,也可以从 JSON 数据解码成对象。

swift
struct Person: Codable {
    var name: String
    var age: Int
    var address: String
}

接下来,我们将创建一个函数来将 Person 对象编码为 JSON 数据,并将其写入文件。

swift
func savePersonToJsonFile(person: Person, fileName: String) {
    let encoder = JSONEncoder()
    encoder.outputFormatting = .prettyPrinted // 使JSON更易读
    
    do {
        let jsonData = try encoder.encode(person)
        
        // 获取Documents目录路径
        if let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
            let fileURL = documentsDirectory.appendingPathComponent(fileName)
            
            // 将JSON数据写入文件
            try jsonData.write(to: fileURL)
            print("JSON数据已成功写入文件:\(fileURL)")
        }
    } catch {
        print("保存JSON数据失败:\(error)")
    }
}

这个函数做了以下几件事:

  1. 创建了一个 JSONEncoder 实例。
  2. 设置 outputFormatting.prettyPrinted,使生成的 JSON 数据更易于阅读。
  3. 使用 encoder.encode(person)Person 对象编码为 JSON 数据。
  4. 获取 Documents 目录的 URL。
  5. 创建文件的完整 URL。
  6. 使用 jsonData.write(to: fileURL) 将 JSON 数据写入文件。

从 JSON 文件读取 Codable 对象

现在,让我们创建一个函数来从 JSON 文件读取数据,并将其解码为 Person 对象。

swift
func loadPersonFromJsonFile(fileName: String) -> Person? {
    if let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
        let fileURL = documentsDirectory.appendingPathComponent(fileName)
        
        do {
            let jsonData = try Data(contentsOf: fileURL)
            let decoder = JSONDecoder()
            let person = try decoder.decode(Person.self, from: jsonData)
            print("JSON数据已成功从文件读取:\(fileURL)")
            return person
        } catch {
            print("读取JSON数据失败:\(error)")
            return nil
        }
    }
    return nil
}

这个函数做了以下几件事:

  1. 获取 Documents 目录的 URL。
  2. 创建文件的完整 URL。
  3. 使用 Data(contentsOf: fileURL) 从文件读取 JSON 数据。
  4. 创建一个 JSONDecoder 实例。
  5. 使用 decoder.decode(Person.self, from: jsonData) 将 JSON 数据解码为 Person 对象。

使用示例

现在,让我们看看如何使用这两个函数。

swift
let person = Person(name: "张三", age: 30, address: "北京市")
let fileName = "person.json"

savePersonToJsonFile(person: person, fileName: fileName)

if let loadedPerson = loadPersonFromJsonFile(fileName: fileName) {
    print("姓名:\(loadedPerson.name),年龄:\(loadedPerson.age),地址:\(loadedPerson.address)")
}

这段代码首先创建了一个 Person 对象,然后将其保存到名为 "person.json" 的文件中。接着,它从该文件读取数据,并将其解码为 Person 对象,最后打印出对象的属性。

错误处理

在实际开发中,错误处理至关重要。在上面的代码中,我们使用了 do-catch 块来处理可能发生的错误,例如文件不存在、JSON 数据格式不正确等。确保你的代码能够优雅地处理这些错误,以提高应用的健壮性。

总结

通过将 Codable 对象存储为 JSON 文件,你可以轻松地在 iOS 应用中持久化复杂的数据结构。这种方法简单、灵活,并且易于维护。希望这个教程能帮助你更好地理解和应用文件系统存储!🚀

本站使用 VitePress 制作