我知道如何使用public T getValue (Class<T> valueType)
将简单的DataSnapshot对象解析为任何Java类。但是在Firebase 3.0之后,我无法将以下数据解析到我的Java类,因为它包含一个我收到NULL的自定义类型实例。
注意:在Firebase 3.0之前,相同的逻辑工作正常。我想它是因为现在Firebase使用的是GSON而不是JACKSON。如果我错了,请纠正我
数据:
{
"address" : "DHA karachi",
"addresstitle" : "DHA karachi",
"logoimage" : {
"bucketname" : "test2pwow",
"id" : "zubairgroup",
"mediaType" : "image/png",
"source" : 1,
"url" : "https://pwowgroupimg.s3.amazonaws.com/zubairgroup1173.png?random=727"
},
"title" : "zubairghori"
}
Group.java
public class Group {
public String address;
public String addresstitle;
public LogoImage logoimage;
public Group(){}
}
LogoImage.java
public class LogoImage {
public String bucketname;
public String id;
public LogoImage(){}
}
代码:
Group group = datasnapshot.getValue(Group.class);
它不会将LogoImage
部分数据库强制转换为logoimage
对象。我们总是在logoimage
对象中检索null。
答案 0 :(得分:10)
public T getValue(Class valueType)
1.该类必须具有不带参数的默认构造函数
2.课程必须为要分配的属性定义公共getter 。没有公共getter的属性将在反序列化实例时设置为默认值
检查来自: this source它会帮助你
答案 1 :(得分:9)
我不确定为什么会给你造成问题。使用您提供的数据,此代码可以正常使用:
DatabaseReference ref = database.getReference("37830692");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Group group = dataSnapshot.getValue(Group.class);
System.out.println(group);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
答案 2 :(得分:2)
我遇到了同样的问题。我解决了这个问题,不仅提供了所有值的吸气剂,,还设置了。希望这会有所帮助。
答案 3 :(得分:1)
我遇到了同样的问题并通过确保构造函数的参数拼写与Firebase中保存的元素相同来解决它。我的错误是我用大写字母和对象参数设置了小写字母的Firebase密钥。