当前位置: 首页 > 知识库问答 >
问题:

Firebase数据库错误-反序列化时需要映射,但得到了java类。util。阵列列表

单于奕
2023-03-14

编辑:想出来了,如果你有类似的问题,检查我发布的答案。

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

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

TemplateModelClass。Java语言

//

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

HashMaps<String, List<String>>,

字符串是转换为字符串的递增整数。列表只是列表中的字符串。以下是来自Firebase的一些JSON示例:

 //

尽我所能格式化它。如果你需要它的图片,请告诉我,我会得到截图

我得到了这个错误,如标题所述:

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

关于这一点,投票最多的问题似乎与使用整数作为键的问题有关,但我认为我总是使用转换为字符串的整数来避免这个问题。它可能会解释得很奇怪,所以我会在这期间尝试更多的东西。感谢阅读!

共有2个答案

楚举
2023-03-14

主要问题是您使用的是列表,而不是地图。正如您的错误所述,反序列化时需要一个映射,但找到的是一个数组列表。

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

private Map<String, Object> mMapOne;

在像这样更改所有这些文件之后,您还需要更改公共设置器和获取器。

希望有帮助。

侯池暝
2023-03-14

好吧,想出来了。如果阅读本文的人有这个问题,并且正在使用增量int/long/任何转换为字符串的东西,您必须在转换后的int中添加一些字符。如果可以转换,Firebase显然会将这些键转换回非字符串。

例如,如果您这样做:

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

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

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

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

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

 类似资料: