将 Firebase 数据快照转换为可编码的 JSON 数据

JSh*_*rpp 4 json firebase swift codable

我正在使用 Firebase 数据库,并且正在尝试使用NSObject. 我NSUnknownKeyException在运行应用程序时收到错误,导致它崩溃。

NSObject:

class WatchList: NSObject {

    var filmid: Int?

}
Run Code Online (Sandbox Code Playgroud)

火力基地代码:

class WatchList: NSObject {

    var filmid: Int?

}
Run Code Online (Sandbox Code Playgroud)

我不确定是什么原因造成的。

此外,为了加强这方面的办法就是让他们借此数据,而不是使用NSObject的,使用的方式Codable,并JSONDecoder与火力地堡数据?

Leo*_*bus 7

您可以简单地使用 JSONSerialization 将快照值属性从 转换AnyData

let data = try? JSONSerialization.data(withJSONObject: snapshot.value)
Run Code Online (Sandbox Code Playgroud)

您还可以扩展 Firebase DataSnapshot 类型并向其添加数据和 json 字符串属性:

import Firebase 

extension DataSnapshot {
    var data: Data? {
        guard let value = value, !(value is NSNull) else { return nil }
        return try? JSONSerialization.data(withJSONObject: value)
    }
    var json: String? { data?.string }
}
extension Data {
    var string: String? { String(data: self, encoding: .utf8) }
}
Run Code Online (Sandbox Code Playgroud)

用法:

guard let data = snapshot.data else { return }
Run Code Online (Sandbox Code Playgroud)


Vas*_*rov 5

现在是 2021 年。

Firebase 最终添加了对解码 Firestore 文档的支持。让你的对象Codable像这样符合和解码:

let result = Result {
  try document?.data(as: City.self)
}
switch result {
case .success(let city):
    if let city = city {
        print("City: \(city)")
    } else {
        print("Document does not exist")
    }
case .failure(let error):
    // A `City` value could not be initialized from the DocumentSnapshot.
    print("Error decoding city: \(error)")
}
Run Code Online (Sandbox Code Playgroud)

只是不要忘记添加'FirebaseFirestoreSwift'pod,然后将其导入到您的文件中。

阅读更多:https : //firebase.google.com/docs/firestore/query-data/get-data#custom_objects

原答案

这里使用的一个非常好的库是Codable Firebase,我也在我的项目中使用它。只需让您的类/结构符合Codable协议并使用 FirebaseDecoder 将您的 Firebase 数据解码为 Swift 对象。

例子:

Database.database().reference().child("model").observeSingleEvent(of: .value, with: { snapshot in
    guard let value = snapshot.value else { return }
    do {
        let model = try FirebaseDecoder().decode(Model.self, from: value)
        print(model)
    } catch let error {
        print(error)
    }
})
Run Code Online (Sandbox Code Playgroud)