将 Firebase Datasnapshot 转换为可编码 JSON 数据
Converting Firebase Datasnapshot to codable JSON data
我正在使用 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,而是将 Codable
和 JSONDecoder
与 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,我也在我的项目中使用它。只需让您的 class / struct 符合 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 }
我正在使用 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,而是将 Codable
和 JSONDecoder
与 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,我也在我的项目中使用它。只需让您的 class / struct 符合 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 }