在 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>>
}
我正在尝试检索看起来像这样的 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>>
}