簡體   English   中英

反序列化時需要一個列表,但得到了一個類 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 並且你應該有一個動物的不同節點將只有動物列表!

  • 用戶
    • sfdasfasfasfasf
      • 用戶數據
        • 電子郵件:“asdf”
        • 名稱:“asdfas”
        • uuid:“dfqwtr4”
      • 動物
        • asdfaskdfjlasdgafd
          • 成人:“asdf”
          • 動物編號:“asdfas”
          • 動物名稱:“dfqwtr
          • 大約年齡:“asdf”
          • 中性:“asdfas”
          • 圖片鏈接:“dfqwtr”
        • sdafasfdasgasga
          • 成人:“asdf”
          • 動物編號:“asdfas”
          • 動物名稱:“dfqwtr
          • 大約年齡:“asdf”
          • 中性:“asdfas”
          • 圖片鏈接:“dfqwtr”

然后你的 pojo 應該看起來像:一個User類,具有UserDataList<Animal>的屬性,具有相應的序列化名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM