gpt4 book ai didi

ios - Swift 5 (Xcode 11 Betas 5 & 6) - 如何写入 JSON 文件?

转载 作者:行者123 更新时间:2023-11-28 11:27:46 34 4
gpt4 key购买 nike

多年来,这个问题已经被问过很多次,但它在 Swift 5 中再次发生了变化,特别是在最近的两个测试版中。

读取一个JSON文件似乎很简单:

func readJSONFileData(_ fileName: String) -> Array<Dictionary<String, Any>> {

var resultArr: Array<Dictionary<String, Any>> = []

if let url = Bundle.main.url(forResource: "file", withExtension: "json") {

if let data = try? Data(contentsOf: url) {

print("Data raw: ", data)

if let json = try? (JSONSerialization.jsonObject(with: data, options: []) as! NSArray) {

print("JSON: ", json)

if let arr = json as? Array<Any> {

print("Array: ", arr)

resultArr = arr.map { $0 as! Dictionary<String, Any> }

}

}

}

}

return resultArr

}

但是编写起来非常困难,并且在该站点上找到的所有以前的方法在 Xcode 11 beta 5 和 6 上的 Swift 5 中都失败了。

如何在 Swift 5 中将数据写入 JSON 文件?

我尝试了这些方法:

除了弃用警告外没有任何错误,当我修复这些错误时,它根本不起作用。

最佳答案

让我们暂时假设您有一些随机集合(数组或字典或它们的一些嵌套组合):

let dictionary: [String: Any] = ["bar": "qux", "baz": 42]

然后你可以像这样将它保存为 JSON 在“Application Support”目录中:

do {
let fileURL = try FileManager.default
.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
.appendingPathComponent("example.json")

try JSONSerialization.data(withJSONObject: dictionary)
.write(to: fileURL)
} catch {
print(error)
}

关于我们现在使用“Application Support”目录而不是“Documents”文件夹的基本原理,请参阅 iOS Storage Best Practices视频或引用File System Programming Guide .但是,无论如何,我们使用这些文件夹,而不是应用程序的“bundle”文件夹,它是只读的。

并读取该 JSON 文件:

do {
let fileURL = try FileManager.default
.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
.appendingPathComponent("example.json")

let data = try Data(contentsOf: fileURL)
let dictionary = try JSONSerialization.jsonObject(with: data)
print(dictionary)
} catch {
print(error)
}

话虽如此,我们通常更喜欢使用强类型的自定义类型,而不是随机字典,因为后者的负担落在程序员身上,以确保键名中没有拼写错误。不管怎样,我们让这些自定义的 structclass 类型符合 Codable:

struct Foo: Codable {
let bar: String
let baz: Int
}

然后我们将使用 JSONEncoder 而不是旧的 JSONSerialization:

let foo = Foo(bar: "qux", baz: 42)
do {
let fileURL = try FileManager.default
.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
.appendingPathComponent("example.json")

try JSONEncoder().encode(foo)
.write(to: fileURL)
} catch {
print(error)
}

并读取该 JSON 文件:

do {
let fileURL = try FileManager.default
.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
.appendingPathComponent("example.json")

let data = try Data(contentsOf: fileURL)
let foo = try JSONDecoder().decode(Foo.self, from: data)
print(foo)
} catch {
print(error)
}

有关从自定义类型准备 JSON 的更多信息,请参阅 Encoding and Decoding Custom Types文章或Using JSON with Custom Types示例代码。

关于ios - Swift 5 (Xcode 11 Betas 5 & 6) - 如何写入 JSON 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57665746/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com