Swift firebase json反序列化

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",

我需要在字典中输入JSON数据,然后将其附加到数组中

下面是应该发生的地方,但我得到了错误

此类不符合密钥的键值编码 K0tA3yTnxAWxCFBZoeyAjcr3yYy1'

下面是课程

使用者

房间

数据库中的Room对象

"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