使用getValue()

时间:2016-06-15 08:58:30

标签: android json firebase firebase-realtime-database

我知道如何使用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。

4 个答案:

答案 0 :(得分:10)

enter image description here public T getValue(Class valueType)

1.该类必须具有不带参数的默认构造函数

2.课程必须为要分配的属性定义公共getter 。没有公共getter的属性将在反序列化实例时设置为默认值

检查来自: this source它会帮助你

detail

答案 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) {

        }
    });

Screenshot of values showing in the debugger

答案 2 :(得分:2)

我遇到了同样的问题。我解决了这个问题,不仅提供了所有值的吸气剂,,还设置了。希望这会有所帮助。

答案 3 :(得分:1)

我遇到了同样的问题并通过确保构造函数的参数拼写与Firebase中保存的元素相同来解决它。我的错误是我用大写字母和对象参数设置了小写字母的Firebase密钥。