【问题标题】:Firebase Database Error - Expected a Map while deserializing, but got a class java.util.ArrayListFirebase 数据库错误 - 反序列化时需要一个 Map,但有一个类 java.util.ArrayList
【发布时间】:2017-10-17 09:22:12
【问题描述】:

编辑:想通了,如果您遇到类似问题,请查看我发布的答案。

我知道有几个关于这个问题的问题,但他们的解决方案都不适用于我。

在我的模型类中,我确保使用 List 而不是 Arraylist 来避免 Firebase 问题,但仍然出现此错误。这是很多代码,但大多数问题都要求提供所有代码,所以我会全部发布。

TemplateModelClass.java

//

我已经成功使用过这个基本模型很多次了。对于

HashMaps<String, List<String>>,

String 是一个递增的 Integer 转换为 String。列表只是列表中的字符串。以下是 Firebase 的一些 JSON 示例:

 //

尽我所能格式化。如果您需要它的图片,请告诉我,我会截取屏幕截图

如标题所述,我收到此错误:

com.google.firebase.database.DatabaseException: Expected a Map while deserializing, but got a class java.util.ArrayList

对此最受支持的问题似乎与使用整数作为键的问题有关,但我认为我通过始终使用转换为字符串的整数来避免这种情况。它可能会奇怪地解释它,所以我会在此期间尝试更多的东西。感谢阅读!

【问题讨论】:

  • 从 firebase 导出 json 并在此处发布

标签: android json firebase firebase-realtime-database


【解决方案1】:

好吧,想通了。如果任何阅读本文的人遇到此问题并且正在使用递增的 int/longs/任何转换为​​字符串的内容,则必须在转换后的 int 中添加一些字符。如果可以转换,Firebase 显然会将这些键转换回非字符串。

例如,如果你这样做:

int inc = 0;
inc++; // 1
map.put(String.valueOf(inc), someList);

Firebase 将该键解释为 1 而不是“1”。

因此,要强制 Fb 将其解释为字符串,请执行以下操作:

int inc = 0;
inc++; // 1
map.put(String.valueOf(inc) + "_key", someList);

一切都很顺利。显然,如果您还需要将这些字符串读回整数,只需用“[_]”拆分字符串,就可以了。

【讨论】:

    【解决方案2】:

    主要问题是您使用的是List 而不是Map。正如您的错误所说,在反序列化时,它是一个 Map,但发现是一个 ArrayList

    因此,为了解决这个问题,您需要使用如下地图更改模型中的所有列表:

    private Map<String, Object> mMapOne;
    

    像这样更改所有这些文件后,您还需要更改您的公共settersgetters

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-10
      • 1970-01-01
      • 2016-12-21
      • 2021-08-24
      • 2020-05-20
      • 1970-01-01
      • 2021-07-08
      • 2020-04-04
      相关资源
      最近更新 更多