从 firebase 检索数据时出现 ClassCastException

Having ClassCastException when retrieving data from firebase

我正在制作一个使用 Firebase 实时数据库的 android 应用程序,当我检索数据时出现 ClassCastException: java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Map

这是我的Java代码

 mref.addChildEventListener(new ChildEventListener() {
                    @Override
                    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                        Map<String, Object> newPost = (Map<String, Object>) dataSnapshot.getValue();
                        System.out.println("First Name: " + newPost.get("FirstName"));
                        System.out.println("Last Name: " + newPost.get("LastName"));
                    }

                    @Override
                    public void onChildChanged(DataSnapshot dataSnapshot, String s) {

                    }

                    @Override
                    public void onChildRemoved(DataSnapshot dataSnapshot) {

                    }

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

                    }

                    @Override
                    public void onCancelled(FirebaseError firebaseError) {

                    }
                });

这是一个logcat

Process: com.firebasedemo, PID: 10509
    java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Map
            at com.firebasedemo.MainActivity.onChildAdded(MainActivity.java:75)
            at com.firebase.client.core.ChildEventRegistration.fireEvent(ChildEventRegistration.java:48)
            at com.firebase.client.core.view.DataEvent.fire(DataEvent.java:45)
            at com.firebase.client.core.view.EventRaiser.run(EventRaiser.java:38)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5001)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)

我建议不要在代码的这个阶段反序列化 Map<String, Object>DataSnapshot class 有遍历数据结构的方法,如果失败会导致更好的错误消息:

@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
    System.out.println("First Name: " + dataSnapshot.child("FirstName").getValue());
    System.out.println("Last Name: " + dataSnapshot.child("LastName").getValue());
}

更好的方法是创建一个 class 来表示数据并使用 Firebase 的内置 JavaBeans 模式处理:

public class Name {
  String firstName;
  String lastName;

  public String getFirstName() {
    return firstName();
  }
  public String getLastName() {
    return lastName();
  }
}

public void onChildAdded(DataSnapshot dataSnapshot, String s) {
    Name name = dataSnapshot.getValue(Name.class);
    System.out.println("First Name: " + name.getFirstName());
    System.out.println("Last Name: " +name.getLastName();
}

请注意,在最后一个示例中,您需要将属性存储为 firstNamelastName,以便它们与字段名称相匹配。有一些方法可以控制它,但我从不费心,只是确保我的 JSON 与我的字段名称匹配。