[英]Firebase Error: "Expected a List while deserializing, but got a class java.util.HashMap"
[英]Expected a List while deserializing, but got a class java.util.HashMap
我正在嘗試從 Android 中的 Firebase 獲取用戶列表。
我已經有了用戶的 uuid,並使用它來嘗試獲取整個對象。 uuid 既是節點名又是用戶節點內的字段(當然是一樣的)。
這是我的代碼:
DatabaseReference usersRef = FirebaseDatabase.getInstance().getReference("users");
Query query = usersRef.orderByChild("uuid").equalTo(animalMarker.getUserUid());
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Log.d(TAG, "onDataChange: xxxxxxxx---- entered onDataChange");
// go to node "users/userUID" , becuase dataSnapshot is parent node
for (DataSnapshot ds : dataSnapshot.getChildren()) {
Log.d(TAG, "xxxxxxxx---- onDataChange: ds= " + ds);
User user = ds.getValue(User.class);
Log.d(TAG, "xxxxxxxx---- onDataChange: user=" + user);
// createdByTV.setText("Created by \n" + user.getEmail());
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
我不知道錯誤“expected List but got HashMap”是來自整個 DataSnapshot 本身,還是來自用戶內部的動物列表(用戶類有一個字段 List animals)
我已經檢查了這個類似的問題Andorid-Expected a List while deserializing,但是得到了一個類 java.util.HashMap和其他幾個,但我仍然不明白哪里出了問題。
編輯:我正在嘗試獲取用戶電子郵件,知道它的 ID(uuid)。 雖然獲取整個 User 對象不是必需的,但我很好奇它是如何完成的,因為我無法做到其中任何一個。
編輯:這是我的用戶類
public class User {
private String uuid;
private String email;
private String name;
private List<User> friends;
private List<Animal> animals;
public User() {
}
public User(String email, String name) {
this.email = email;
this.name = name;
}
public User(String uuid, String email, String name) {
this.uuid = uuid;
this.email = email;
this.name = name;
}
... // getters and setters, toString and other such
}
當試圖獲取其中沒有動物節點的用戶時,一切正常。 但是當試圖讓用戶在里面有動物節點時,應用程序崩潰了。
實際上,我回答了那個問題,但在這種情況下,問題有點不同。 所以你收到以下錯誤:
預期列表但得到 HashMap
因為存在於每個用戶對象中的animals
節點不是動物對象列表,實際上是動物對象的地圖,這就是出現此錯誤的原因。
雖然獲取整個 User 對象不是必需的,但我很好奇它是如何完成的,因為我無法做到其中任何一個。
沒錯,您只需使用以下代碼行即可獲取電子郵件地址:
String email = ds.child("email").getValue(String.class);
現在,要將DataSnapshot
對象映射到User
並從特定用戶獲取動物對象列表,請刪除:
//private List<User> friends;
//private List<Animal> animals;
並使用以下代碼行:
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference animalsRef = rootRef.child("users").child(uid).child("animals");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
List<Animal> animalList = new ArrayList<>();
for(DataSnapshot ds : dataSnapshot.getChildren()) {
Animal animal = ds.getValue(Animal.class);
animalList.add(animal);
}
//Do what you need to do with the animalList
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
}
};
animalsRef.addListenerForSingleValueEvent(valueEventListener);
動物列表不在用戶內部,而是在用戶節點內部。 在任何情況下,將其置於用戶對象內部似乎比需要的嵌套更多。 你應該有另一個節點的動物
user_animals:{
uid:{key1:{}, key2:{}
}
您現在的問題是您正在查詢而不是獲取節點值
usersRef.child(uid).addSingleEvent..
...onDataChange...
User user = datasnapshot.getValue(User.class);
您需要創建一個用戶類來反映 RTD 中的用戶屬性
構建樹的方式是問題的根源。
就在今天,我在重構一個舊項目的 firebase 樹時遇到了同樣的錯誤,所以我在谷歌中查找錯誤並找到了這個頁面,我注意到你的動物節點中的這 3 個用戶屬性看起來不合適。
所以我回到我的樹,顯然我在我的一個列表節點中錯誤地添加了一個鍵:值對,所以我刪除了它們,一切都很好。
問題:
這是因為您有一個動物列表,並且在該列表中您有這 3 個鍵值(電子郵件、uuid、名稱),這會混淆 firebase serilization,因此他試圖將其轉換為 hashmap
解決方案:
我認為如果您不解決它並按照以下方式操作,您將來會受益:3 個用戶屬性 email、name 和 uuid 應該包裝在用戶樹內的不同節點中,比如 user_data 並且你應該有一個動物的不同節點將只有動物列表!
然后你的 pojo 應該看起來像:一個User
類,具有UserData
和List<Animal>
的屬性,具有相應的序列化名稱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.