我有一个用户类
public class User {
@SerializedName("username")
private String userName;
@SerializedName("email")
private String email;
@SerializedName("bags")
private List<Bag> bags;
.
.
.
我在firebase DB中有这些数据
在我添加“bags”项目之前,对象创建正常,我正在使用此方法通过uid检索用户:
public void retrieveUserByUid(String uid, FirebaseRetrieveUserListener listener){
Query userQuery = dbReference.child(FirebaseChild.users.name()).child(uid);
final FirebaseRetrieveUserListener dataListener = listener;
userQuery.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
User user = dataSnapshot.getValue(User.class);
dataListener.retrieveUserByUid(user);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
正如我所说,这个没有“袋子”项目,当我说它,我得到的错误就是这个。
com.google.firebase.database.DatabaseException: Expected a List while deserializing, but got a class java.util.HashMap
当我尝试这样做时会发生这种情况
User user = dataSnapshot.getValue(User.class);
我搜索了很多关于如何检索列表的信息,但我发现只检索单个列表对象,而不是“单一数据”和列表的“混合”对象。
答案 0 :(得分:1)
正如您所说的那样,反序列化时预计会HashMap
而不是List
。由于Firebase是NoSQL数据库,因此Firbease中的所有内容都构成为键和值对。因此,Firebase中的每个节点都是Map
。要解决此问题,请将bags
从列表更改为HashMap
,您的问题就会得到解决。
你也可以试试这个:
GenericTypeIndicator<List<YourClass>> t = new GenericTypeIndicator<List<Message>>() {};
List<YourClass> messages = snapshot.getValue(t);
答案 1 :(得分:0)
试试这个:
@SerializedName("bags")
private Map<String,Bag> bags;