代码之家  ›  专栏  ›  技术社区  ›  Stefan

firebase json反序列化swift

  •  0
  • Stefan  · 技术社区  · 7 年前

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

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

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

    我已经使用dictionary方法从数据库中检索用户,但我发现datasnapshots之间存在一些差异。

    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是什么,这里有一个屏幕截图可以很好地解释它。。。 Screenshot

    这是一个liveCell,你可以看到数据在哪里匹配。黄色矩形是另一个uicollectionview,其中包含一组成员profileimages,其中每个配置文件图像都位于红方块内。

    希望这能解决问题

    2 回复  |  直到 7 年前
        1
  •  1
  •   Jay    7 年前

    给定与您类似的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
    
        2
  •  0
  •   jlmurph    7 年前

    奇怪的解决方案,但您不应该使用firebase强制转换到[String:AnyObject]。这对我来说也不管用,但是:

    snapshot.value as? [String:Any]
    

    已经奏效了。在定制用例(房间、汽车等的类)中,添加自定义类来解释快照的价值,这更多是开发人员的责任 snapshot.value