Swift firebase json反序列化
我需要在字典中输入JSON数据,然后将其附加到数组中 下面是应该发生的地方,但我得到了错误 此类不符合密钥的键值编码 K0tA3yTnxAWxCFBZoeyAjcr3yYy1' 下面是课程 使用者 房间 数据库中的Room对象Swift firebase json反序列化,swift,firebase-realtime-database,nsdictionary,firebase-storage,json-deserialization,Swift,Firebase Realtime Database,Nsdictionary,Firebase Storage,Json Deserialization,我需要在字典中输入JSON数据,然后将其附加到数组中 下面是应该发生的地方,但我得到了错误 此类不符合密钥的键值编码 K0tA3yTnxAWxCFBZoeyAjcr3yYy1' 下面是课程 使用者 房间 数据库中的Room对象 "rooms" : { "B7C7E469-945E-4327-9473-AAE34FCB9B41" : { "groupChatDescription" : "123ae", "groupChatName" : "Test123",
"rooms" : {
"B7C7E469-945E-4327-9473-AAE34FCB9B41" : {
"groupChatDescription" : "123ae",
"groupChatName" : "Test123",
"members" : {
"K0tA3yTnxAWxCFBZoeyAjcr3yYy1" : {
"email" : "S@gmail.com",
"name" : "Steve",
"profileImageUrl" : "https://firebasestorage.googleapis.com"
}
},
"owner" : "Steve"
}
},
总而言之,房间是房间的数组,房间是特定的房间对象,成员是用户的数组,成员是特定的用户
我已经使用dictionary方法从数据库中检索用户,但是我发现datasnapshots之间存在一些差异
来自FireBase的snapshot.value:
Optional({
email = "S@gmail.com";
name = Steve;
profileImageUrl =
"https://firebasestorage.googleapis.com";
})
这种格式适用于字典
使用printroom.members的数据快照:
这种格式不适用于字典,我相信这是因为键,但我不知道如何摆脱它,因为这就是我在members数组中分离每个成员的基本方式
有什么建议吗
至于liveCell是什么,这里有一个屏幕截图可以很好地解释它。。。
这是一个liveCell,您可以看到数据匹配的位置。黄色矩形是另一个uicollectionview,其中包含成员阵列profileimages,其中每个配置文件图像将位于红方块内
希望这能解决这个奇怪的问题,但你不应该用firebase强制转换到[String:AnyObject]。这对我也不起作用,但是:
snapshot.value as? [String:Any]
他成功了。开发人员更应该负责添加自定义类,以便在房间、汽车等的自定义用例类中解释快照的价值,方法是适当地转换snapshot.value的可能键。这里有一种干净、简单的方法来填充房间数组,而不是试图修复所有代码,每个房间都有一组用户 给定一个与你类似的火基结构
"rooms"
"room_0"
"groupChatName" : "Test123",
"members"
"user_0"
"name" : "Barry"
"user_1"
"name" : "Maurice"
"user_2"
"name" : "Robin"
我们从RoomClass和UserClass开始。请注意,我让这些类执行繁重的工作—它们拆下快照并存储其值
注意,我将members子节点视为快照,以便在维护其key:value对的同时对其进行迭代
class RoomClass {
var key = ""
var groupChatName = ""
var membersArray = [UserClass]()
init(snapshot: DataSnapshot) {
let dict = snapshot.value as! [String: Any]
let membersSnap = snapshot.childSnapshot(forPath: "members")
let snapKey = snapshot.key
let groupName = dict["groupChatName"] as! String
self.key = snapKey
self.groupChatName = groupName
for member in membersSnap.children {
let memberSnap = member as! DataSnapshot
let user = UserClass(snapshot: memberSnap)
self.membersArray.append(user)
}
}
}
class UserClass {
var key = ""
var name = ""
init(snapshot: DataSnapshot) {
let dict = snapshot.value as! [String: Any]
let snapKey = snapshot.key
let userName = dict["name"] as! String
self.key = snapKey
self.name = userName
}
}
然后,我们定义存储房间的数组和填充它的代码
var roomsArray = [RoomClass]()
func doButton0Action() {
let roomsRef = self.ref.child("rooms")
roomsRef.observeSingleEvent(of: .value, with: { snapshot in
for child in snapshot.children {
let snap = child as! DataSnapshot
let room = RoomClass(snapshot: snap)
self.roomsArray.append(room)
}
//this just demonstrates the rooms and members are loaded
for room in self.roomsArray {
let groupChatName = room.groupChatName
print(groupChatName)
for user in room.membersArray {
let userName = user.name
print(" \(userName)")
}
}
})
}
以及输出
Test123
Barry
Maurice
Robin
我仍然无法将member.setValuesForKeysuserDictionary加入Fire问题中缺少一些信息为什么self.liveCell?有成员吗?有点不清楚,成员是一个用户数组不清楚-它似乎被定义为用户类中的通用词典。也许你的意思是把它定义为一个像[用户]这样的用户数组?或者它应该是一个口述?也许是另一个阵列?你能把问题整理一下吗?我觉得答案应该很简单。@Jay我编辑的问题很好。非常感谢。
"rooms"
"room_0"
"groupChatName" : "Test123",
"members"
"user_0"
"name" : "Barry"
"user_1"
"name" : "Maurice"
"user_2"
"name" : "Robin"
class RoomClass {
var key = ""
var groupChatName = ""
var membersArray = [UserClass]()
init(snapshot: DataSnapshot) {
let dict = snapshot.value as! [String: Any]
let membersSnap = snapshot.childSnapshot(forPath: "members")
let snapKey = snapshot.key
let groupName = dict["groupChatName"] as! String
self.key = snapKey
self.groupChatName = groupName
for member in membersSnap.children {
let memberSnap = member as! DataSnapshot
let user = UserClass(snapshot: memberSnap)
self.membersArray.append(user)
}
}
}
class UserClass {
var key = ""
var name = ""
init(snapshot: DataSnapshot) {
let dict = snapshot.value as! [String: Any]
let snapKey = snapshot.key
let userName = dict["name"] as! String
self.key = snapKey
self.name = userName
}
}
var roomsArray = [RoomClass]()
func doButton0Action() {
let roomsRef = self.ref.child("rooms")
roomsRef.observeSingleEvent(of: .value, with: { snapshot in
for child in snapshot.children {
let snap = child as! DataSnapshot
let room = RoomClass(snapshot: snap)
self.roomsArray.append(room)
}
//this just demonstrates the rooms and members are loaded
for room in self.roomsArray {
let groupChatName = room.groupChatName
print(groupChatName)
for user in room.membersArray {
let userName = user.name
print(" \(userName)")
}
}
})
}
Test123
Barry
Maurice
Robin