14.5 存储和读取Codable对象为JSON文件
在iOS开发中,使用文件系统存储数据是一种常见且强大的方法。特别是当你需要存储复杂的数据结构时,将 Codable 对象存储为 JSON 文件是一个非常棒的选择。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,并且易于解析和生成。让我们一起看看如何实现吧!🎉
存储 Codable 对象为 JSON 文件
首先,你需要一个符合 Codable 协议的对象。Codable 是 Encodable 和 Decodable 的组合,意味着你的对象可以被编码成 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)")
}
}这个函数做了以下几件事:
- 创建了一个
JSONEncoder实例。 - 设置
outputFormatting为.prettyPrinted,使生成的 JSON 数据更易于阅读。 - 使用
encoder.encode(person)将Person对象编码为 JSON 数据。 - 获取 Documents 目录的 URL。
- 创建文件的完整 URL。
- 使用
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
}这个函数做了以下几件事:
- 获取 Documents 目录的 URL。
- 创建文件的完整 URL。
- 使用
Data(contentsOf: fileURL)从文件读取 JSON 数据。 - 创建一个
JSONDecoder实例。 - 使用
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 应用中持久化复杂的数据结构。这种方法简单、灵活,并且易于维护。希望这个教程能帮助你更好地理解和应用文件系统存储!🚀