#java #android #kotlin #retrofit #retrofit2
Вопрос:
Я пытаюсь получить данные из ответа с помощью Retrofit, но получаю нулевое значение. если я поджариваю ответ, он всегда равен нулю, но ответ отображается в журнале, но он не загружается в просмотр вторсырья
пожалуйста, помогите мне, это задание для собеседования
Мой Ответ Link:
https://bikewise.org:443/api/v2/locations/markers?proximity=45.521728,-122.67326amp;proximity_square=100
Мой Фактический Ответ
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {
"title": "Stolen 2021 Specialized Sirrus 2.0 (03-14-2021)",
"description": "<img src='https://files.bikeindex.org/uploads/Pu/408280/large_IMG_5771.JPG'> <a target="_blank" href="https://bikeindex.org/bikes/1018433">View details</a>",
"occurred_at": "2021-03-14 22:31:13 -0500",
"marker-size": "small",
"marker-color": "#E74C3C",
"id": 136982
},
"geometry": {
"type": "Point",
"coordinates": [
-122.65,
45.51
]
}
}
Класс ApiClient
object ApiClient {
var BASE_URL: String = "https://bikewise.org:443/api/v2/locations/"
val getClient: ApiInterfac
get() {
val gson = GsonBuilder().setLenient().create()
val interceptor = HttpLoggingInterceptor()
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY)
val client = OkHttpClient.Builder().addInterceptor(interceptor).build()
val retrofit = Retrofit.Builder().baseUrl(BASE_URL).client(client).addConverterFactory(GsonConverterFactory.create(gson)).build()
return retrofit.create(ApiInterfac::class.java)
}
}
Класс ApiInterface:
@GET("markers?proximity=45.521728,-122.67326amp;proximity_square=100")
fun getVideoList(): Call < DataVideos >
}
Класс Модели
data class DataVideos(
// @SerializedName("type")
var listme:List<Videos>,
@SerializedName("title")
var title:String,
@SerializedName("description")
var description: String)
Из var listme:Список ниже-это класс видео
class Videos {
@SerializedName("title")
val title: String? = null
@SerializedName("description")
val description: String? = null
}
Мои данные Становятся забавными
private fun getDat1a() {
Log.d(TAG, "GetDataFun")
val call: Call < DataVideos > = ApiClient .getClient.getVideoList()
call.enqueue(object: Callback < DataVideos > {
override fun onResponse(call: Call < DataVideos > ? , response : Response < DataVideos > ? ) {
if(response!!.isSuccessful){
Toast.makeText(activity?.applicationContext!!,"Data:" response!!.body()!!.listme,Toast.LENGTH_LONG).show()
val rst=response!!.body()
progerssProgressDialog.dismiss()
dataList.addAll(listOf(rst!!))
recyclerView.adapter!!.notifyDataSetChanged()
}
}
override fun onFailure(call: Call < DataVideos> ? , t : Throwable ? ) {
progerssProgressDialog.dismiss()
Log.d(TAG, "Failes" t)
}
})
}
Я получаю null и в тостах, и в recyclerview, но в журналах я могу найти данные
Мои журналы могут отображать выходные данные
{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"title":"Stolen 2021 Specialized Sirrus 2.0 (03-14-2021)","description":"u003cimg src='https://files.bikeindex.org/uploads/Pu/408280/large_IMG_5771.JPG'u003e u003ca target="_blank" href="https://bikeindex.org/bikes/1018433"u003eView detailsu003c/au003e","occurred_at":"2021-03-14 22:31:13 -0500","marker-size":"small","marker-color":"#E74C3C","id":136982},"geometry":{"type":"Point","coordinates":[-122.65,45.51]}},{"type":"Feature","properties":{"title":"Stolen 2018 Surly Straggler (01-13-2021)","description":"u003cimg src='https://files.bikeindex.org/uploads/Pu/144946/large_IMG_4383.jpg'u003e Break in to my garage. u003ca target="_blank" href="https://bikeindex.org/bikes/516282"u003eView detailsu003c/au003e","occurred_at":"2021-01-13 05:00:00 -0600","marker-size":"small","marker-color":"#EE8276","id":134325},"geometry":{"type":"Point","coordinates":[-122.69,45.59]}}]}
2021-03-18 09:26:45.027 7776-8035/com.lab.optisol I/okhttp.OkHttpClient: <-- END HTTP (51772-byte body)
Комментарии:
1. пожалуйста, убедитесь в классе данных. Я думаю, что это неправильно
Ответ №1:
Используйте эту модель в ответ
fun getVideoList(): Call<YourResponse>
data class YourResponse(
val type: String? = null,
val features: ArrayList<Features>? = null
)
data class Features(
val type: String? = null,
val properties: Properties? = null,
val geometry:Geometry?=null
)
class Properties(
@SerializedName("title")
@Expose
val title: String? = null,
@SerializedName("description")
@Expose
val description: String? = null,
@SerializedName("occurred_at")
@Expose
val occurred_at: String? = null,
@SerializedName("marker-size")
@Expose
val marker_size: String? = null,
@SerializedName("marker-color")
@Expose
val marker_color: String? = null,
@SerializedName("id")
@Expose
val id: Int? = null
)
data class Geometry(
val type:String?=null,
val coordinates:ArrayList<Double>?=null
)
Комментарии:
1. Я создал новые «Функции класса данных» и скопировал приведенный выше код, но теперь тост не работает из-за NullPointer.. я не понимаю этого -> >
data class YourResponse( val type: String? = null, val features: ArrayList? = null )
и как сделать звонок веселымfun getVideoList(): Call<YourResponse>
2. Спасибо вам большое, что это сработало для меня… ты мне очень помогла
3. в
getDat1a()
полеval rst=response!!.body()
заполнено ответом «Сейчас я получаю значения в тосте», но я не смог перечислить его в Recyclerview, можете ли вы мне помочь?4. покажите мне свой адаптер и код, в котором вы устанавливаете данные
Ответ №2:
Ваш DataVideo
класс не подходит для десериализации JSON. Эти классы не имеют необходимых сериализованных ключей.
Используйте эти классы
data class Response(
@SerializedName("features")
val features: List<Feature>?,
@SerializedName("type")
val type: String?
)
data class Feature(
@SerializedName("geometry")
val geometry: Geometry?,
@SerializedName("properties")
val properties: Properties?,
@SerializedName("type")
val type: String?
)
data class Geometry(
@SerializedName("coordinates")
val coordinates: List<Double>?,
@SerializedName("type")
val type: String?
)
data class Properties(
@SerializedName("description")
val description: String?,
@SerializedName("id")
val id: Int?,
@SerializedName("marker-color")
val markerColor: String?,
@SerializedName("marker-size")
val markerSize: String?,
@SerializedName("occurred_at")
val occurredAt: String?,
@SerializedName("title")
val title: String?
)
Для создания классов данных с помощью JSON вы можете использовать плагин JsonToKotlinClass для Android Studio
Комментарии:
1. я изменил свой класс данных, как показано ниже, но все равно сталкиваюсь с тем же нулем… «
2. в
getDat1a()
том, как мы можем получить недвижимость?
Ответ №3:
Чтобы десериализовать, подумайте об этом как о паре значений ключа с ключом, являющимся именем, указанным в аннотации @serializedName, и значением, которое должно быть указано в поле данных, которое вы предоставляете ниже.
Теперь сравните это с моделями, которые вы создали.
- Прежде всего, вы не даете аннотации @serializedName переменной listme, как бы она узнала, какое значение ключа для сериализации в этой переменной должно иметь аннотацию @serializedName(«функции»).
- В json выше ключа «функции» у нас есть ключ «тип», который имеет значение string, поэтому нам нужна другая переменная в виде строки с @serializedName типа .
- Теперь давайте посмотрим внутри вашего класса модели видео, где значения внутри функций —> Список у нас нет ничего, чтобы сериализовать ключ «тип» и «свойства» из json внутри вашей модели, поэтому создайте соответствующую модель и переменную с теми же ключами, что и в ответе json, как в ответе @Amit pandey