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

杰克·巴什福德

多年来,这个问题已经问了好几次了,但是在Swift 5中,尤其是在最近的两个beta中,它再次发生变化

读取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到“应用程序支持”目录中,如下所示:

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)
}

要了解为什么我们现在使用“应用程序支持”目录而不是“文档”文件夹,请参阅iOS Storage Best Practices视频或参阅《文件系统编程指南》但是,无论如何,我们都使用这些文件夹,而不是应用程序的“ 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的更多信息,请参见编码和解码自定义类型文章或使用JSON与自定义类型示例代码。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

.enumerateGroupsWithTypes阻止停止参数Swift(Xcode 6 beta 5)

如何打开.plist文件作为源代码xcode 11 beta 5

我可以下载Xcode 11 beta 5的iOS 13 beta 6模拟器吗?

Xcode 11 beta swift ui preview not showing

Xcode 11 Beta 5中的API更改后,如何在SwiftUI中为TextField使用RoundedBorderTextFieldStyle?

数组大小更改后如何刷新ForEach显示元素的数量(SwiftUI,Xcode 11 Beta 5)

解决Xcode 11 beta 5中的SwiftUI Path崩溃

Xcode 11 Beta 5 - 模态仅触发一次

Xcode 11 Beta 5-加载插件失败

Xcode 11 Swift 5 CryptoKit共享SymmetricKey

使用swift 2(xcode 7 beta 5)解析注册错误

Xcode 7 Beta 5 Swift 2冗余符合协议错误

无法在此文件中预览-[App Name] .app可能在Xcode 11 Beta 5上崩溃了

如何迅速将核心数据管理对象数组转换为“可识别”列表?(Xcode 11,Beta 5)

Xcode6 beta 5占用了所有空内存,Swift

Swift:XCode6 Beta 5在AppDelegate中的核心数据对象上给出了错误

UIView初始值设定项Swift Xcode 6 beta 5

Swift 2.0 Beta:协议在Xcode Beta 5中是否被打破?

升级到iOS13 beta 6 / Xcode 11 beta 5后:发出“ dyld:未找到符号:_ $ s7SwiftUI7BindingVyxGAA0C11ConvertibleAAMc”

Xcode 11 beta 6背后的Xcode 11 beta 7下载链接?

Xcode 11 beta 5中止陷阱:在@Published变量上调用接收器时发生6错误

分段错误:11-Xcode / Swift 5编译问题

XCODE 11,SWIFT5。绘图线,框等

NSCache,图像缓存,不缓存(Xcode 11,Swift 5)

.send()和.sink()对于Xcode 11 Beta 5中的PassthroughSubject似乎不再起作用

SwiftUI / CoreData /母版/明细(带有编辑)/ Xcode 11-Beta 5

在Xcode 11 Beta 5中使用ForEach时为什么会出错?

Xcode 11 Beta 5更新无差别地破坏了我的项目

在xcode 11 beta5和swiftui上进行深层链接