firebase json 反序列化 swift
firebase json deserialization swift
我需要将 JSON 数据输入字典,然后附加到数组。
下面是应该发生的地方,但我收到错误
this class is not key value coding-compliant for the key
K0tA3yTnxAWxCFBZoeyAjcr3yYy1.'
let room = rooms[indexPath.row]
if let dictionary = room.members {
let user = User()
user.setValuesForKeys(dictionary)
liveCell.members.append(user)
}
下面是类
用户
class User: NSObject {
var email: String?
var name: String?
var profileImageUrl: String?
}
房间
class Room: NSObject {
var rid: String?
var owner: String?
var groupChatName: String?
var groupChatDescription: String?
var members: NSDictionary?
}
数据库中的房间对象
"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"
}
},
概括一下,rooms是房间的数组,room是具体的房间对象,members是用户的数组,member是具体的用户。
我已经使用字典方法从我的数据库中检索用户,但我发现数据快照之间存在一些差异。
snapshot.value 来自 FireBase:
Optional({
email = "S@gmail.com";
name = Steve;
profileImageUrl =
"https://firebasestorage.googleapis.com";
})
此格式适用于字典
数据快照使用print(room.members)
:
Optional({
K0tA3yTnxAWxCFBZoeyAjcr3yYy1 = {
email = "S@gmail.com";
name = Steve;
profileImageUrl =
"https://firebasestorage.googleapis.com";
};
})
这种格式不适用于字典,我相信这是因为键,但我不知道如何摆脱它,因为这基本上是我分隔成员数组中每个成员的方式。
有什么建议吗?
至于liveCell是什么,这里有截图很好的解释了...
这是一个 liveCell,您可以看到数据匹配的地方。黄色矩形是另一个 uicollectionview,它包含成员 profileimages 数组,其中每个个人资料图像都将在红色方块内。
希望这能解决问题
奇怪的解决方案,但您不应该使用 firebase 强制转换为 [String:AnyObject]。它对我也从来没有用过,但是在做:
snapshot.value as? [String:Any]
有效。开发人员有更多责任添加自定义 classes 以通过适当地转换 snapshot.value
的可能键来解释自定义用例中快照的值(class 用于房间、汽车等) .
这里没有尝试修复所有这些代码,而是一种干净、简单的方法来填充一组房间,其中每个房间都有一组用户。
给定一个类似于您的 Firebase 结构
"rooms"
"room_0"
"groupChatName" : "Test123",
"members"
"user_0"
"name" : "Barry"
"user_1"
"name" : "Maurice"
"user_2"
"name" : "Robin"
我们从 RoomClass 和 UserClass 开始。请注意,我让那些 类 完成了繁重的工作——它们会拆除快照并存储它的值。
请注意,我将成员子节点视为快照,因此我可以在维护它的键值对的同时对其进行迭代。
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
我需要将 JSON 数据输入字典,然后附加到数组。
下面是应该发生的地方,但我收到错误
this class is not key value coding-compliant for the key K0tA3yTnxAWxCFBZoeyAjcr3yYy1.'
let room = rooms[indexPath.row]
if let dictionary = room.members {
let user = User()
user.setValuesForKeys(dictionary)
liveCell.members.append(user)
}
下面是类
用户
class User: NSObject {
var email: String?
var name: String?
var profileImageUrl: String?
}
房间
class Room: NSObject {
var rid: String?
var owner: String?
var groupChatName: String?
var groupChatDescription: String?
var members: NSDictionary?
}
数据库中的房间对象
"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"
}
},
概括一下,rooms是房间的数组,room是具体的房间对象,members是用户的数组,member是具体的用户。
我已经使用字典方法从我的数据库中检索用户,但我发现数据快照之间存在一些差异。
snapshot.value 来自 FireBase:
Optional({
email = "S@gmail.com";
name = Steve;
profileImageUrl =
"https://firebasestorage.googleapis.com";
})
此格式适用于字典
数据快照使用print(room.members)
:
Optional({
K0tA3yTnxAWxCFBZoeyAjcr3yYy1 = {
email = "S@gmail.com";
name = Steve;
profileImageUrl =
"https://firebasestorage.googleapis.com";
};
})
这种格式不适用于字典,我相信这是因为键,但我不知道如何摆脱它,因为这基本上是我分隔成员数组中每个成员的方式。
有什么建议吗?
至于liveCell是什么,这里有截图很好的解释了...
这是一个 liveCell,您可以看到数据匹配的地方。黄色矩形是另一个 uicollectionview,它包含成员 profileimages 数组,其中每个个人资料图像都将在红色方块内。
希望这能解决问题
奇怪的解决方案,但您不应该使用 firebase 强制转换为 [String:AnyObject]。它对我也从来没有用过,但是在做:
snapshot.value as? [String:Any]
有效。开发人员有更多责任添加自定义 classes 以通过适当地转换 snapshot.value
的可能键来解释自定义用例中快照的值(class 用于房间、汽车等) .
这里没有尝试修复所有这些代码,而是一种干净、简单的方法来填充一组房间,其中每个房间都有一组用户。
给定一个类似于您的 Firebase 结构
"rooms"
"room_0"
"groupChatName" : "Test123",
"members"
"user_0"
"name" : "Barry"
"user_1"
"name" : "Maurice"
"user_2"
"name" : "Robin"
我们从 RoomClass 和 UserClass 开始。请注意,我让那些 类 完成了繁重的工作——它们会拆除快照并存储它的值。
请注意,我将成员子节点视为快照,因此我可以在维护它的键值对的同时对其进行迭代。
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