在 Android (Java/Kotlin) 上改造 JSONLD 错误

Retrofit JSONLD ERROR on Android (Java/Kotlin)

我正在尝试检索看起来像这样的 JSON 响应:

    {
  "@context": "/api/contexts/Advert",
  "@id": "/api/adverts",
  "@type": "hydra:Collection",
  "hydra:member": [
    {
      "@id": "/api/adverts/6",
      "@type": "Advert",
      "id": 6,
      "title": "PS5 Neuve !",
      "content": "Je vends la toute nouvelle Playstation 5, le prix est non négociable.",
      "author": "Jonathan Kaekr",
      "email": "JonhatanK@hotmail.fr",
      "category": "/api/categories/2",
      "price": 995,
      "state": "draft",
      "createdAt": "2020-11-25T09:29:13+00:00",
      "publishedAt": "2020-11-25T09:33:59+00:00",
      "image": null
    },

但是当我尝试使用 Retrofit 检索它时,它给了我这个错误:Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

这是我使用的文件:

Interface.kt :

 package com.example.lebonangle.data

import retrofit2.Call
import retrofit2.http.GET

interface LeBonAngleApi {

    @GET("http://192.168.1.10:8000/api/adverts?page=1")
    fun getAdverts(): Call<List<Adverts>>
}

Class.kt :

package com.example.lebonangle.data

class Adverts {
    var title: String? = null
    var content: String? = null
    var author: String? = null
    var email: String? = null
    var price: Int? = null
}

以及我在 mainActivity 中使用的功能:

val retrofit = Retrofit.Builder()
            .baseUrl(advertUrl)
            .addConverterFactory(GsonConverterFactory.create())
            .build()

        val service = retrofit.create(LeBonAngleApi::class.java)
        val adverts = service.getAdverts()

        adverts.enqueue(object: Callback<List<Adverts>> {
            override fun onResponse(call: Call<List<Adverts>>, response: Response<List<Adverts>>) {
                val allTanStop = response.body()
                allTanStop?.let {
                    for( advert in it) {
                        Log.d("ADD","Annonce ${advert.title}")
                    }
                }
            }
            override fun onFailure(call: Call<List<Adverts>>, t: Throwable) {
                Log.e("ADD", "Error : $t")
            }
        })

根据 Call api ,我们期望响应是一个数组,但是 json 对象不是以数组开头的

正确api调用:

       package com.example.lebonangle.data

import retrofit2.Call
import retrofit2.http.GET

interface LeBonAngleApi {

    @GET("http://192.168.1.10:8000/api/adverts?page=1")
    fun getAdverts(): Call<Advert>
}

正确型号:

package com.example.lebonangle.data
    data class Advert(
         @SerializedName("@context")
        var context: String?,
        @SerializedName("hydra:member")
        var hydraMember: List<Any>?,
        @SerializedName("@id")
        var id: String?,
        @SerializedName("@type")
        var type: String?
    )

我有相同的铅。 我为此创建 class :

data class HydraMember<T> (
    @SerializedName("hydra:member")
     var hydraMember: List<T>? = null
)

和api调用:

interface myApiCalls{

    @GET("api/first_model")
    fun getFirstModels(): Call<HydraMember<FirstModel>>

    @GET("api/second_model")
    fun getSecondModels(): Call<HydraMember<SecondModel>>
}