Android Kotlin MVVM架构中无法解析Json数据

问题描述 投票:0回答:1

我正在创建一个应用程序,在其中调用rest api并将所有数据存储在SQLite Room数据库中,然后我从Room数据库检索该数据并显示在RecycleView中

下面是我的视图模型

class CompletedTaskSummaryViewModel(private val repository: CompletedTaskSummaryRepository) : ViewModel() {

    private val _completedTaskSummaryList = MutableLiveData<List<CompletedTaskSummaryReport>>()
    val completedTaskSummaryList: LiveData<List<CompletedTaskSummaryReport>> get() = _completedTaskSummaryList

    var completedTaskListener: CompletedTaskSummaryReportListener? = null

    fun getCompletedTaskSummaryReport() {
        completedTaskListener?.onStarted()

        Coroutines.main {
            try {
                val completedTaskSummaryRequest = CompletedTaskSummaryRequest(
                    frmdate = "2023-09-01",
                    todate = "2023-11-10"
                )

                val authResponse = repository.getCompletedTaskSummary(completedTaskSummaryRequest)

                authResponse.data?.let { responseObject ->
                    val nestedList = responseObject.data // Access the nested list
                    if (nestedList != null && nestedList.isNotEmpty()) {
                        val flatList = nestedList.flatten()
                        _completedTaskSummaryList.value = flatList
                        repository.saveCompletedTaskSummaryList(flatList)
                        completedTaskListener?.onSuccess(flatList)
                    }
                    return@main
                }


            } catch (e: ApiExceptions) {
                completedTaskListener?.onFailure(e.message!!)
            } catch (e: NoInternetException) {
                completedTaskListener?.onFailure(e.message!!)
            }
        }
    }
}

下面是我的数据类,它保存从 api 接收的数据

data class CompletedTaskSummaryResponse<T>(
    val rId: Int,
    val data: NestedData<T>?, // Use NestedData<T> instead of just T
    val eId: Int?,
    val eDesc: String?
)

data class NestedData<T>(
    val data: List<T>?
)

下面是我的存储库

class CompletedTaskSummaryRepository(private val api: MyApi, private val db: AppDatabase) :
    SafeApiRequest() {

    suspend fun getCompletedTaskSummary(completedTaskSummaryRequest: CompletedTaskSummaryRequest): CompletedTaskSummaryResponse<List<CompletedTaskSummaryReport>> {
        return apiRequest { api.GetCompletedTaskSummaryReport(completedTaskSummaryRequest) }
    }

    suspend fun saveCompletedTaskSummaryList(completedTaskSummaryList: List<CompletedTaskSummaryReport>) {
        withContext(Dispatchers.IO) {
            db.getCompletedTaskReport().upsert(completedTaskSummaryList)
        }
    }

    fun getCompletedTaskSummaryReport() =
        db.getCompletedTaskReport().getCompletedTaskSummaryReport()
}

以下功能在我的MyApi接口中

@Headers("Content-Type: application/json", "AuthenticationKey: 51b1d8b6-02d8-4fe7-af9e-a10d5a05d95c")
    @POST("api/JobManagement/getCompletedTaskSummaryReport")
    suspend fun GetCompletedTaskSummaryReport(
        @Body completedTaskSummaryRequest: CompletedTaskSummaryRequest
    ): Response<CompletedTaskSummaryResponse<List<CompletedTaskSummaryReport>>>

下面是我的API响应

{
    "rId": 0,
    "data": [
        {
            "data": [
                {
                    "CompletedDate": "13-Oct-2023",
                    "TotalCompletedTask": 1,
                    "TotalTeam": 1
                },
                
            ]
        }
    ]
}

我遇到以下错误

FATAL EXCEPTION: main
                                                                                                    Process: com.secure.assaanelectricitynew.code, PID: 1085
                                                                                                    com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 18 path $.data
                                                                                                        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:226)
                                                                                                        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131)
                                                                                                        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222)
                                                                                                        at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:40)
                                                                                                        at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:27)
                                                                                                        at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:243)
                                                                                                        at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:153)
                                                                                                        at okhttp3.RealCall$AsyncCall.execute(RealCall.java:174)
                                                                                                        at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
                                                                                                        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137)
                                                                                                        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637)
                                                                                                        at java.lang.Thread.run(Thread.java:1012)
                                                                                                        Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@30fc25b, Dispatchers.Main]
                                                                                                    Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 18 path $.data
                                                                                                        at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:385)
                                                                                                        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:215)
                                                                                                        ... 11 more
android kotlin mvvm retrofit
1个回答
0
投票

Expected BEGIN_OBJECT but was BEGIN_ARRAY
只是意味着某些 json 实际上以
[
开头,而不是以
{
开头,这就是
data
字段的情况。

顶层

data
是一个数组,但您将其视为单个对象。改变

val data: NestedData<T>?,

val data: List<NestedData<T>>?,

也许能解决你的问题

© www.soinside.com 2019 - 2024. All rights reserved.