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



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

NSObject:

class WatchList: NSObject {
var filmid: Int?
}

Firebase代码:

ref.child("users").child(uid!).child("watchlist").observe(DataEventType.childAdded, with: { (info) in
print(info)

if let dict = info.value as? [String: AnyObject] {
let list = WatchList()
list.setValuesForKeys(dict)
print(list)
}        
}, withCancel: nil)

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

此外,增强此解决方案是他们获取此数据的一种方式,而不是使用NSObject,而是将CodableJSONDecoder与Firebase数据一起使用?

现在是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)")
}

只是不要忘记添加'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)
}
})

您可以简单地使用JSONSerialization将快照值属性从Any转换为Data:

let data = try? JSONSerialization.data(withJSONObject: snapshot.value)

您还可以扩展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) }
}

用法:

guard let data = snapshot.data else { return }

相关内容

  • 没有找到相关文章

最新更新