平台类android(无注释)需要显式注册JsonAdapter

Ahm*_*rim 7 android kotlin

尽管我从 udacity 获得了另一个代码并且我完全按照在那里完成的方式进行了几天,但仍然出现相同的错误。我错过了什么吗?

I have searched everywhere and tried many ways to solve this problem but i still get the same error "requires explicit JsonAdapter to be registered". I tried rebuild project, sync with file system, delete the dependencies and sync again BUT it never worked.

数据类

import android.os.Parcelable
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
import kotlinx.android.parcel.Parcelize

@Parcelize
data class Post(

    @Json(name = "id") var postId: Int,

    val title: String,

    val userId: Int,

    val postDate: String,

    val location: String,

    @Json(name = "pictureUrl") val picture: String

) : Parcelable
Run Code Online (Sandbox Code Playgroud)

I also tried to use @JsonClass(generateAdapter = true) but it did not work

api服务类

import android.example.kliekje.data.Post
import com.jakewharton.retrofit2.adapter.kotlin.coroutines.CoroutineCallAdapterFactory
import com.squareup.moshi.Moshi
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
import retrofit2.Retrofit
import retrofit2.converter.moshi.MoshiConverterFactory
import retrofit2.http.GET
import kotlinx.coroutines.Deferred

private const val BASE_URL = " https://ahmad.ysebie.be/"

private val moshi = Moshi.Builder()
    .add(KotlinJsonAdapterFactory())
    .build()

 private val retrofit = Retrofit.Builder()
    .addConverterFactory(MoshiConverterFactory.create(moshi))
    .addCallAdapterFactory(CoroutineCallAdapterFactory())
    .baseUrl(BASE_URL)
    .build()

interface PostApiService {
    @GET("api/post")
    fun getProperties():
    // The Coroutine Call Adapter allows us to return a Deferred, a Job with a result
            Deferred<List<Post>>
}

object PostApi {
    val retrofitService : PostApiService by lazy { retrofit.create(PostApiService::class.java) }
}
Run Code Online (Sandbox Code Playgroud)

Here how i get to the api data

ViewModel 帖子类

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.example.android.marsrealestate.network.PostApi
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch


enum class PostApiStatus { LOADING, ERROR, DONE }

class PostsOverviewViewModel : ViewModel(){

    private val _response = MutableLiveData<String>()

    val response: LiveData<String>
        get() = _response

  private var viewModelJob = Job()
  private val coroutineScope = CoroutineScope(viewModelJob + Dispatchers.Main)

    init {
        getPosts()
    }

    private fun getPosts() {
        coroutineScope.launch {
            var getPropertiesDeferred = PostApi.retrofitService.getProperties()
            try {
                var listResult = getPropertiesDeferred.await()
                _response.value = "succes " + listResult?.size + "posts"
            }
            catch(t: Throwable){
                _response.value = "Failure: " + t.message
            }
        }
    }

    override fun onCleared() {
        super.onCleared()
        viewModelJob.cancel()
    }
}
Run Code Online (Sandbox Code Playgroud)

ViewModel post class

编辑文本

 <EditText

        android:text="@{viewModel.response}"
 />
Run Code Online (Sandbox Code Playgroud)

For now i only want to show the size of the list that get from the Api

我一直得到的例外

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: android.example.kliekje, PID: 23179
    java.lang.IllegalArgumentException: Unable to create converter for java.util.List<android.example.kliekje.data.Post>
        for method PostApiService.getProperties
        at retrofit2.Utils.methodError(Utils.java:52)
        at retrofit2.HttpServiceMethod.createResponseConverter(HttpServiceMethod.java:70)
        at retrofit2.HttpServiceMethod.parseAnnotations(HttpServiceMethod.java:46)
        at retrofit2.ServiceMethod.parseAnnotations(ServiceMethod.java:36)
        at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:168)
        at retrofit2.Retrofit$1.invoke(Retrofit.java:147)
        at java.lang.reflect.Proxy.invoke(Proxy.java:1006)
        at $Proxy2.getProperties(Unknown Source)
        at android.example.kliekje.posts_overview.PostsOverviewViewModel$getPosts$1.invokeSuspend(PostsOverviewViewModel.kt:33)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
        at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:233)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
     Caused by: java.lang.IllegalArgumentException: Platform class android.example.kliekje.data.Post (with no annotations) requires explicit JsonAdapter to be registered
    for class android.example.kliekje.data.Post
    for java.util.List<android.example.kliekje.data.Post>
        at com.squareup.moshi.Moshi$LookupChain.exceptionWithLookupStack(Moshi.java:348)
        at com.squareup.moshi.Moshi.adapter(Moshi.java:149)
        at com.squareup.moshi.Moshi.adapter(Moshi.java:97)
        at com.squareup.moshi.Moshi.adapter(Moshi.java:67)
        at com.squareup.moshi.CollectionJsonAdapter.newArrayListAdapter(CollectionJsonAdapter.java:52)
        at com.squareup.moshi.CollectionJsonAdapter$1.create(CollectionJsonAdapter.java:36)
        at com.squareup.moshi.Moshi.adapter(Moshi.java:137)
        at com.squareup.moshi.Moshi.adapter(Moshi.java:97)
        at retrofit2.converter.moshi.MoshiConverterFactory.responseBodyConverter(MoshiConverterFactory.java:91)
        at retrofit2.Retrofit.nextResponseBodyConverter(Retrofit.java:328)
        at retrofit2.Retrofit.responseBodyConverter(Retrofit.java:311)
        at retrofit2.HttpServiceMethod.createResponseConverter(HttpServiceMethod.java:68)
            ... 16 more
     Caused by: java.lang.IllegalArgumentException: Platform class android.example.kliekje.data.Post (with no annotations) requires explicit JsonAdapter to be registered
        at com.squareup.moshi.ClassJsonAdapter$1.create(ClassJsonAdapter.java:60)
        at com.squareup.moshi.Moshi.adapter(Moshi.java:137)
            ... 26 more
Run Code Online (Sandbox Code Playgroud)

有人可以帮我解决这个问题,因为我已经被困了几天了!谢谢大家