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

时间:2018-11-30 22:04:06

标签: json swift firebase codable

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

NSObject:

class WatchList: NSObject {

var filmid: Int?

}

Firebase代码:

ref.child(“用户”).child(uid!)。child(“监视列表”).observe(DataEventType.childAdded,其中:{(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数据一起使用?

2 个答案:

答案 0 :(得分:2)

在这里使用的一个非常好的库是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)
    }
})

答案 1 :(得分:0)

您可以简单地使用JSONSerialization将快照值属性从areT_v转换为template <typename T, typename ...Ts> inline constexpr bool areT_v = std::conjunction_v<std::is_same<T,Ts>...>; static_assert( areT_v<int,int,int,int>); static_assert(!areT_v<int,int,int,char>);

Any

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

Data

用法:

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