При модернизации — Получение NULL в качестве ответа, но результаты указаны в журналах

#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, и значением, которое должно быть указано в поле данных, которое вы предоставляете ниже.

Теперь сравните это с моделями, которые вы создали.

  1. Прежде всего, вы не даете аннотации @serializedName переменной listme, как бы она узнала, какое значение ключа для сериализации в этой переменной должно иметь аннотацию @serializedName(«функции»).
  2. В json выше ключа «функции» у нас есть ключ «тип», который имеет значение string, поэтому нам нужна другая переменная в виде строки с @serializedName типа .
  3. Теперь давайте посмотрим внутри вашего класса модели видео, где значения внутри функций —> Список у нас нет ничего, чтобы сериализовать ключ «тип» и «свойства» из json внутри вашей модели, поэтому создайте соответствующую модель и переменную с теми же ключами, что и в ответе json, как в ответе @Amit pandey

Ответ №4:

Чтобы создать правильный класс модели , вы можете загрузить плагин Json в класс Kotlin, и когда вы создадите новый класс, нажмите alt вставить, вы получите опцию преобразовать json в класс kotlin. Там вы можете опубликовать свой ответ json, и ваш класс модели будет создан.плагин