Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Firebase Datasnapshot转换为可编码的JSON数据_Json_Swift_Firebase_Codable - Fatal编程技术网

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

将Firebase Datasnapshot转换为可编码的JSON数据,json,swift,firebase,codable,Json,Swift,Firebase,Codable,我正在使用Firebase数据库,并试图通过NSObject检索和使用数据。运行应用程序时,我收到一个NSUnknownKeyException错误,导致它崩溃 NSObject: class WatchList: NSObject { var filmid: Int? } Firebase代码: ref.child(“用户”).child(uid!).child(“观察列表”).observe(DataEventType.childAdded,其中:{(info))在 打印(信息

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

NSObject:

class WatchList: NSObject {

    var filmid: Int?

}
Firebase代码:

ref.child(“用户”).child(uid!).child(“观察列表”).observe(DataEventType.childAdded,其中:{(info))在
打印(信息)
如果让dict=info.value为?[字符串:AnyObject]{
let list=WatchList()
列表.设置值标记(dict)
打印(列表)
}        
},带取消:无)
我不确定这是什么原因造成的

此外,增强此解决方案是他们获取此数据的一种方式,而不是使用NSObject,而是对Firebase数据使用
Codable
JSONDecoder

现在是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,然后将其导入到您的文件中

阅读更多:

原始答案

这里有一个非常好的库,我也在我的项目中使用它。只需使您的类/结构符合
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 }