我正在创建一个应用程序,在其中调用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
Expected BEGIN_OBJECT but was BEGIN_ARRAY
只是意味着某些 json 实际上以 [
开头,而不是以 {
开头,这就是 data
字段的情况。
顶层
data
是一个数组,但您将其视为单个对象。改变
val data: NestedData<T>?,
到
val data: List<NestedData<T>>?,
也许能解决你的问题