Firebase Database Error - Expected a Map while deserializing, but got a class java.util.ArrayList

北慕城南 提交于 2020-01-11 12:29:07

问题


Edit: Figured it out, check my posted answer if you're having similar issues.

I know there are several questions about this issue, but none of their solutions are working for me.

In my model class I have made sure to use List instead of Arraylist to avoid Firebase issues, but am still getting this error. It's a lot of code but most questions ask for all the code so I'll post it all.

TemplateModelClass.java

//

I've used this basic model successfully many times. For the

HashMaps<String, List<String>>,

the String is an incremented Integer converted to String. The List's are just Strings in a List. Here's some sample JSON from Firebase:

 //

Formatted that as best as I could. If you need a picture of it let me know and I'll get a screenshot

And am getting this error, as stated in the title:

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

The most upvoted question about this seems to have something to do with a problem using an integer as a key, but I think I've avoided that by always using an integer converted to a string. It may be interpreting it strangely, so I'll try some more stuff in the meantime. Thanks for reading!


回答1:


Alright, figured it out. If anyone reading this has this problem and are using incremented ints/longs/whatever that get converted to strings, you must add some characters to the converted int. Firebase apparently converts these keys back into non-Strings if it can be converted.

For example, if you do something like this:

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

Firebase interprets that key as 1 instead of "1".

So, to force Fb to intepret as a string, do something like this:

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

And everything works out perfectly. Obviously if you also need to read those Strings back to ints, just split the string with "[_]" and you're good to go.




回答2:


The main issue is that you are using a List instead of a Map. As your error said, while deserializing it is expectig a Map but is found an ArrayList.

So in order to solve this problem youd need to change all the lists in your model with maps like this:

private Map<String, Object> mMapOne;

After changing all those fileds like this, you need also to change your public setters and getters.

Hope it helps.



来源:https://stackoverflow.com/questions/44032887/firebase-database-error-expected-a-map-while-deserializing-but-got-a-class-ja

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!