Firebase数据库错误 - 反序列化时预期映射,但得到了一个类java.util.ArrayList

时间:2017-05-17 19:02:06

标签: android json firebase firebase-realtime-database

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

我知道这个问题有几个问题,但他们的解决方案都没有对我有用。

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

TemplateModelClass.java

//

我已成功多次使用此基本模型。对于

HashMaps<String, List<String>>,

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

 //

尽我所能格式化。如果你需要它的图片让我知道,我会得到一个截图

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

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

关于这一问题最受欢迎的问题似乎与使用整数作为键的问题有关,但我想我总是使用转换为字符串的整数来避免这种情况。它可能会奇怪地解释它,所以我会在此期间尝试更多的东西。谢谢你的阅读!

2 个答案:

答案 0 :(得分:1)

主要问题是您使用的是if而不是List。正如您的错误所述,虽然反序列化它是Map,但却找到了Map

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

ArrayList

更改所有这些文件后,您还需要更改公开private Map<String, Object> mMapOne; setters

希望它有所帮助。

答案 1 :(得分:0)

好吧,想通了。如果有人读这个有这个问题并使用递增的ints / longs /无论转换为字符串,你必须在转换后的int中添加一些字符。如果可以转换,Firebase显然会将这些密钥转换回非字符串。

例如,如果您执行以下操作:

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

Firebase将该密钥解释为1而不是&#34; 1&#34;。

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

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

一切都很完美。显然,如果你还需要将这些字符串读回int,只需将字符串拆分为&#34; [_]&#34;而且你很高兴去。