反序列化时需要一个列表,但得到一个带有嵌套对象的类 java.util.HashMap

Posted

技术标签:

【中文标题】反序列化时需要一个列表,但得到一个带有嵌套对象的类 java.util.HashMap【英文标题】:Expected a List while deserializing, but got a class java.util.HashMap with nested object 【发布时间】: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 等里面有什么? 【参考方案1】:

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

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

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

【讨论】:

以上是关于反序列化时需要一个列表,但得到一个带有嵌套对象的类 java.util.HashMap的主要内容,如果未能解决你的问题,请参考以下文章

Java - 如何反序列化带有嵌套对象和列表的 JSON 数组? [复制]

在自定义JsonConverter中反序列化嵌套对象List

C# 使用对象列表中的对象反序列化 JSON - 但无法访问它

反序列化带有标记为 AsReference 的成员的类时删除了 ProtoException

Spring RestTemplate在尝试反序列化嵌套的对象列表时返回null对象

将cXML反序列化为C#类