gpt4 book ai didi

java - 反序列化时需要一个列表,但得到了一个类 java.util.HashMap

转载 作者:行者123 更新时间:2023-12-05 00:12:34 25 4
gpt4 key购买 nike

我正在尝试从 Android 中的 Firebase 获取用户列表。

enter image description here

我已经有了用户的 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本身,还是来自用户内部的animals List(用户类有一个字段List animals)

我已经检查过这个类似的问题 Andorid-Expected a List while deserializing, but got a class 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
}

当试图获取其中没有动物节点的用户时,一切正常。但是当试图让用户在里面有动物节点时,应用程序崩溃了。

最佳答案

实际上,我回答了那个问题,但在这种情况下,问题有点不同。所以你会收到以下错误:

expected List but got HashMap

因为存在于每个用户对象中的animals 节点不是动物对象列表实际上是动物对象的映射,这就是出现此错误的原因。

While getting the entire User object is not necessary, I'm curios as to how it would be done, since I can't manage to do either of these.

没错,您只需使用以下代码行即可获取电子邮件地址:

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);

关于java - 反序列化时需要一个列表,但得到了一个类 java.util.HashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55694354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com