如何将 Firebase 数据转换为 Java 对象...?

Posted

技术标签:

【中文标题】如何将 Firebase 数据转换为 Java 对象...?【英文标题】:How to Convert Firebase data to Java Object...? 【发布时间】:2015-09-05 03:39:41 【问题描述】:

使用Firebase库以Message(String, String)的形式向服务器发送数据,添加到HashMap<String, Message>

例子:

Firebase fb = new Firebase(URL);
Firebase msgRef = fb.child("finished");
HashMap<String, Message> msgList = new HashMap<>();
Message msg = new Message(m, n);
msgList.put(HASHKEY, msg);
msgRef.push().setValue(msgList);

使用 Firebase 方法接收数据时addValueEventListener() 获取此表单中的字符串

 key = finished, value = 
    -Js9Rn0uttjYIGdcv8I1=Moosa=message=email, name=Kamran,
    -Js9Vsmv6BnVzOzpl2L8=Moosa=message=msgs, name=Imran, 
    -Js9WtQ8yeDwVxQMFCZb=Moosa=message=samsung, name=Samad, 
    -Js9RarxoJPKn4RO2HaM=Moosa=message=Message, name=Moosa, 
    -Js9b6f75lwwbsqQNJz0=Moosa=message=Qmobile, name=Bilal, 
    -Js9aDxt8TlgTGUccuxu=Moosa=message=last, name=Moosa 

如何将其转换为消息对象.....????

【问题讨论】:

【参考方案1】:

还有另外两种方法可以将您的数据从 Firebase DataSnapshot 中取出,而无需使用 Map&lt;String, Object&gt;

第一种方法是使用DataSnapshot的方法来遍历孩子:

ref = FirebaseDatabase.getInstance().getReference("messages").limitToLast(10);
ref.addValueEventListener(new ValueEventListener() 
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) 
        for (DataSnapshot messageSnapshot: dataSnapshot.getChildren()) 
            String name = (String) messageSnapshot.child("name").getValue();
            String message = (String) messageSnapshot.child("message").getValue();
        
    

    @Override
    public void onCancelled(FirebaseError firebaseError)  
);

在上面的 sn-p 中,我们使用getChildren() 来获取您的消息的Iterable。然后我们使用child("name") 来获取每个特定的子属性。

第二种方法是使用内置的 JSON-to-POJO 序列化器/反序列化器。当您发送消息列表时,其中的 Message 对象会被序列化为 JSON 并存储在 Firebase 中。

要让他们再次摆脱困境,你必须做相反的事情:

ref.addValueEventListener(new ValueEventListener() 
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) 
        for (DataSnapshot messageSnapshot: dataSnapshot.getChildren()) 
            Message message = messageSnapshot.getValue(Message.class);
        
    

    @Override
    public void onCancelled(FirebaseError firebaseError)  
);

在第二个 sn-p 中,我们仍然使用 getChildren() 来获取消息,但现在我们将它们从 JSON 反序列化直接返回到 Message 对象。

对于使用最后一种方法的简单示例应用程序,请查看Firebase's androidChat sample。它还展示了如何有效地处理消息列表(提示:FirebaseListAdapter)。

【讨论】:

在您的第二种方法中,firebase 数据如何映射到 pojo 的属性? pojo属性名和firebase节点名是否需要完全匹配? @ParagKadam 是的,只要它们具有相同的字段名称。 如果像“name”和“message”这样的属性是动态的。如何获取数据快照并生成对象。将 Json 对象直接转换为 Java 对象。 您可以将值放入Map&lt;String,Object&gt;。但我建议不要这样做。如果对象是动态的,则最好坚持使用 DataSnapshot 本身。【参考方案2】:

如果您想使用 Gson 库将 firebase 对象转换为 json,请使用此代码:

databaseReference.addValueEventListener(new ValueEventListener() 
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) 
            Object object = dataSnapshot.getValue(Object.class);
            String json = new Gson().toJson(object);
            Example example= new Gson().fromJson(json, Example.class);
            Log.e("json","json: " + example.getGlossary());
        

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) 

        
    );

这将使用 Gson Lib 将完整的数据库结构转换为字符串 json,然后将 json 转换为类对象

【讨论】:

【参考方案3】:

您可以使用ChildEventListener 而不是ValueEventListener

例如。我有一个名为 match 的类,具有 3 个字符串属性 id, name, photoUrl,然后我将所有值添加到 List 中。而不是使用 for 循环,它适用于我的代码。

    Query queryRef = mDatabase.child("users").child(user.getUid()).child("matches");

    ChildEventListener listener = new ChildEventListener() 
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) 
            Match match = dataSnapshot.getValue(Match.class);
            matchList.add(match);
            mAdapter = new MatchAdapter(getContext(), matchList);
            recyclerView.setAdapter(mAdapter);
        
        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) 
            Log.d("MESSAGEFRAGMENT", "CHILDCHANGE");
        
        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) 
        

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) 

        

        @Override
        public void onCancelled(DatabaseError databaseError) 

        
    ;
    queryRef.addChildEventListener(listener);

【讨论】:

【参考方案4】:

因此,如果您想获取消息,可以执行以下操作:

        for (DataSnapshot child : dataSnapshot.getChildren())
    //child is each element in the finished list
    Map<String, Object> message = (Map<String, Object>)child.getValue();
    Message msg = new Message((String) message.getValue().get("message"),
            (String) message.get("name"));

【讨论】:

它在两种情况下都返回空值... dataSnapshot.getValue(); child.getValue(); 你能显示你发送到firebase的请求吗?还有你用什么方法来检索数据onDataChangeonChildAdded?? Firebase msgRef = fb.child("messagebox"); HashMap&lt;String, Message&gt; msgList = new HashMap&lt;&gt;(); Message msg = new Message(m, n); msgList.put("Moosa", msg); msgRef.push().setValue(msgList); 好的,你能检查dataSnapshotchild 的值并打印出来吗 使用嵌套 for 循环并在上述解决方案的帮助下迭代子值.... Thnx Bro....【参考方案5】:

迭代dataSnapshot的值并获取Children使用嵌套for循环迭代children的子元素并获取Required Value...

for (DataSnapshot child : dataSnapshot.getChildren()) 
                    for (DataSnapshot single : child.getChildren()) 
                        Map<String, Object> map = (Map<String, Object>) single.getValue();
                        String a = (String) map.get("message");
                        String b = (String) map.get("name");
                        textView.append(b + " -- " + a + "\n");
                    
                

【讨论】:

以上是关于如何将 Firebase 数据转换为 Java 对象...?的主要内容,如果未能解决你的问题,请参考以下文章

com.google.firebase.database.DatabaseException:无法将 java.lang.String 类型的对象转换为数据类对象 KOTLIN

com.google.firebase.database.DatabaseException:无法将 java.lang.String 类型的值转换为 long

将 Firebase 数据对象转换为数组

如何将firebase REST API响应转换为打字稿中的数组?

如何将 Firebase 上传图片的图片下载 URL 转换为 base64

将firebase json转换为打字稿数组