【问题标题】:Expected a List while deserializing, but got a class java.util.HashMap with nested object反序列化时需要一个列表,但得到一个带有嵌套对象的类 java.util.HashMap
【发布时间】:2022-01-02 21:16:04
【问题描述】:

我有嵌套数据类的问题。这是我的数据类:

@Entity(tableName = "categories_table")
data class Category(
    var details: String = "",
    @PrimaryKey
    var id: String = "",
    var lastUpdated: Long = -1,
    var name: String = "",
    var order: Int = -1,
    val specialities: ArrayList<String> = arrayListOf()
) 

这是我的数据库:

我使用此代码从数据库中获取数据:

val valueEventListener = object : ValueEventListener {
            override fun onDataChange(snapshot: DataSnapshot) {
                categories.clear()
                specialities.clear()
                for (cat in snapshot.children){
                    val category: Category? = cat.getValue(Category::class.java)
                    for (spec in cat.children){
                        spec.getValue(String::class.java)?.let { specialities.add(it) }
                    }
                    category?.let { categories.add(it) }
                }
                _categories.value = categories
            }

            override fun onCancelled(error: DatabaseError) {
                throw error.toException()
            }
        }

        categoryRef.addListenerForSingleValueEvent(valueEventListener)

我有很多关于这个问题的主题,但找不到解决方案,总是得到这个错误:

 Expected a List while deserializing, but got a class java.util.HashMap

编辑 我有进步)

for (cat in snapshot.children) {
                    val categoryMap: Map<String, Any> = cat.value as Map<String, Any>
                    val category = Category(details = categoryMap.getValue("details").toString(), name = categoryMap.getValue("name").toString(),
                                            id = categoryMap.getValue("id").toString(), lastUpdated = categoryMap.getValue("lastUpdated").toString().toLong(),
                                            order = categoryMap.getValue("order").toString().toInt())
                    categories.add(category)

我不确定我解析的地图是否正确,但它确实有效。如果我错了请告诉我)

【问题讨论】:

  • “categoryRef”是如何定义的?
  • biochemistrydentist 等里面有什么?

标签: android firebase kotlin firebase-realtime-database


【解决方案1】:

问题似乎来自val specialities: ArrayList&lt;String&gt; = arrayListOf()

为了使您的数据库屏幕截图中的专业被视为List,它们将具有带有连续数字键的已定义顺序:012 等。但是 have 是一堆键,每个键都有一个值或一个嵌套对象,转换为Map&lt;String, Object&gt;

val specialities: Map<String, Object> = mapOf()

【讨论】:

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