You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中如何从Cloud Firestore集合获取对象列表?

如何从Cloud Firestore中获取对象列表(listTask字段)

我来帮你搞定这个问题!你日志里看到的那个类似JSON的结构,其实是Firestore Android SDK把数组字段解析成了**List<Map<String, Any>>**类型,而不是JSONArray——这就是为什么你用JSONArray处理会出错的核心原因。Firestore在Android端会自动把文档里的数组转成Java的List,数组里的每个对象则对应一个Map<String, Any>,键就是字段名,值就是对应的数据。

下面给你两种处理方式,从简单直接到规范易维护:

方式1:直接遍历List获取数据

你可以直接把document.data["listTask"]强转为List<Map<String, Any>>,然后逐个取出每个task的字段:

db.collection("project").get()
    .addOnSuccessListener { result ->
        Log.d(TAG, "onRefresh: loadProject")
        for (document in result){
            if (document.data["owner_id"] == id){
                counter++
                // 安全强转成List<Map<String, Any>>,避免类型转换异常
                val taskList = document.data["listTask"] as? List<Map<String, Any>>
                taskList?.forEach { taskMap ->
                    val taskId = taskMap["id"] as? Int
                    val taskTitle = taskMap["title"] as? String
                    val taskStatus = taskMap["status"] as? Boolean
                    
                    Log.d(TAG, "Task: id=$taskId, title=$taskTitle, status=$taskStatus")
                }
            }
        }
    }

方式2:转成实体类(更规范的长期方案)

如果你的项目里经常要处理Task数据,建议定义一个对应的数据类,把Map转成实体类,这样代码更易读、更易维护,也方便后续扩展:

首先定义Task数据类:

data class Task(
    val id: Int,
    val title: String,
    val status: Boolean
)

然后在回调里把List<Map>转成List<Task>:

db.collection("project").get()
    .addOnSuccessListener { result ->
        Log.d(TAG, "onRefresh: loadProject")
        for (document in result){
            if (document.data["owner_id"] == id){
                counter++
                val taskList = (document.data["listTask"] as? List<Map<String, Any>>)?.map { taskMap ->
                    Task(
                        id = taskMap["id"] as Int,
                        title = taskMap["title"] as String,
                        status = taskMap["status"] as Boolean
                    )
                }
                
                // 现在taskList就是类型安全的List<Task>,可以直接使用
                taskList?.forEach { task ->
                    Log.d(TAG, "Task: ${task.title}, status: ${task.status}")
                }
            }
        }
    }

补充说明

你日志里看到的[{id=29356, title=Database, status=false}, ...]其实是Java中List和Map的默认toString()输出格式,看起来像JSON但本质是不同的结构,所以不能用JSONArray来解析,直接用List和Map处理就完全没问题啦。

内容的提问来源于stack exchange,提问作者kharismarizqii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 00:42:44