【问题标题】:Parsing from DataSnapshot to Java class in Firebase using getValue()在 Firebase 中使用 getValue() 从 DataSnapshot 解析为 Java 类
【发布时间】:2023-03-11 15:54:01
【问题描述】:

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

【问题讨论】:

  • firebaser here Firebase 不使用 GSON。我们只是在最新版本中删除了对 Jackson 的依赖,以减少我们对 APK 大小的影响。什么部分在这里引起问题?你能展示用这些类读取数据的最小代码吗?
  • 我无法使用这行代码将此数据解析为组:Group group = datasnapshot.getValue(Group.class); 它不会将数据库的 LogoImage 部分转换为 logoimage 对象。我们总是在 logoimage 对象中检索 null。
  • 我在下面添加了一个非答案,以表明您的代码在我尝试时有效。我实际上只是将您的 JSON 导入我的数据库并将您的类复制到测试项目中。我不确定为什么你没有得到任何结果,而我使用的是相同的代码。 :-/

标签: android json firebase firebase-realtime-database


【解决方案1】:

我不确定为什么这会给您带来问题。根据您提供的数据,这段代码对我来说很好:

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

        }
    });

【讨论】:

  • 如果您发布了 Group 类的屏幕截图,这将是完美的答案。
  • 这个答案已经快一年了。但我很确定我只是使用了问题中的Group 类。
【解决方案2】:

public T getValue(Class valueType)

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

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

从以下位置检查: this source对你有帮助

detail

【讨论】:

    【解决方案3】:

    我遇到了同样的问题。我解决了这个问题,不仅为所有值提供 getter,还为 setter 提供。希望这会有所帮助。

    【讨论】:

    • 我认为您可以尝试将此行添加到您的班级名称上方。例如:@IgnoreExtraProperties public class LogoImage { public String bucketname;公共字符串 ID;公共 LogoImage(){} }
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      相关资源
      最近更新 更多