Я новичок в использовании Retrofit, поэтому у меня есть это JSON с сервера
{
"results_found": 572,
"results_start": 0,
"results_shown": 20,
"restaurants": [
{
"restaurant": {
"R": {
"has_menu_status": {
"delivery": -1,
"takeaway": -1
},
"res_id": 18941862
},
"apikey": "c3abca45d8387e5b1c900563f1d63193",
"id": "18941862",
"name": "Pizza Maru",
"url": "https://www.zomato.com/jakarta/pizza-maru-1-thamrin?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1",
"location": {
"address": "Grand Indonesia Mall, East Mall, Lantai 3A, Jl. M.H. Thamrin No. 1, Thamrin, Jakarta",
"locality": "Grand Indonesia Mall, Thamrin",
"city": "Jakarta",
"city_id": 74,
"latitude": "-6.1954467635",
"longitude": "106.8216102943",
"zipcode": "",
"country_id": 94,
"locality_verbose": "Grand Indonesia Mall, Thamrin, Jakarta"
},
"switch_to_order_menu": 0,
"cuisines": "Pizza",
"timings": "10 AM to 10 PM",
"average_cost_for_two": 180000,
"price_range": 3,
"currency": "IDR",
"highlights": [
"Credit Card",
"Delivery",
"No Alcohol Available",
"Dinner",
"Debit Card",
"Lunch",
"Cash",
"Takeaway Available",
"VAT",
"Air Conditioned",
"Wifi",
"Service Charge",
"Indoor Seating",
"Table booking recommended"
],
"offers": [],
"opentable_support": 0,
"is_zomato_book_res": 1,
"mezzo_provider": "ZOMATO_BOOK",
"is_book_form_web_view": 0,
"book_form_web_view_url": "",
"thumb": "https://b.zmtcdn.com/data/pictures/chains/2/18941862/403aa36cb046e86a694e7989bb7cd545.jpg?fit=around%7C200%3A200&crop=200%3A200%3B%2A%2C%2A",
"user_rating": {
"aggregate_rating": "4.4",
"rating_text": "Sangat Baik",
"rating_color": "5BA829",
"rating_obj": {
"title": {
"text": "4.4"
},
"bg_color": {
"type": "lime",
"tint": "700"
}
},
"votes": "928"
},
"all_reviews_count": 739,
}
, и у меня есть несколько классов для сопоставления, что JSON будет kotlin class
базовый ответ:
data class RestaurantListBaseResponse (
@SerializedName("results_found")
val results_found : Int = 0,
@SerializedName("results_start")
val results_start : Int = 0,
@SerializedName("results_shown")
val results_shown : Int = 0,
@SerializedName("restaurants")
val restaurants : ArrayList<Restaurant> = ArrayList()
)
ресторанный класс
data class Restaurant (
@SerializedName("id")
val id : Int,
@SerializedName("name")
val name : String,
@SerializedName("url")
val url : String,
@SerializedName("location")
val location : Location,
@SerializedName("currency")
val currency : String,
@SerializedName("phone_numbers")
val phone_numbers : String
)
и местоположение
data class Location (
@SerializedName("address")
val address : String = "",
@SerializedName("city")
val city : String = "",
@SerializedName("latitude")
val latitude : Double = 0.0,
@SerializedName("longitude")
val longitude : Double = 0.0,
@SerializedName("zipcode")
val zipcode : String = ""
)
Я на самом деле могу получить данные на мой android, но все значение в свойствах объекта становится пустым, когда я получаю доступ к значению свойств ресторана , Ресторан (id = 0, name = null, url = null, location = null, currency = null, phone_numbers = null)]
, но я могу получить значение results_found
(не нуль ), который имеет свойства RestaurantListBaseResponse
,
, поэтому у меня проблема при отображении ресторана JSON на kotlin.
, как вы можете видеть, класс ресторана не есть все свойства от JSON, я просто пишу свойства, которые важны. это создает проблему? пожалуйста помоги.
вот интерфейс API
interface RestaurantAPI {
@Headers("user-key: $USER_KEY_ZOMATO")
@GET("search")
fun searchRestaurants(
@Query("radius") radius: Int,
@Query("q") searchedKeyword: String,
@Query("lat") latitude: Double,
@Query("lon") longitude: Double
): Call<RestaurantListBaseResponse>
}
и вот генератор сервисов
object RetrofitServiceGenerator {
private val loggingInterceptor = HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)
private val okHttpClient = OkHttpClient.Builder()
.callTimeout(7, TimeUnit.SECONDS)
.addInterceptor(loggingInterceptor)
.build()
private var retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build()
fun <T> getInstance(APIType: Class<T>) : T {
return retrofit.create(APIType)
}
}
и я вызываю его с помощью этого кода
val restaurantService = RetrofitServiceGenerator.getInstance(RestaurantAPI::class.java)
val requestCall = restaurantService.searchRestaurants(1000,"pizza",-6.219225,106.834572)
requestCall.enqueue(object: Callback<RestaurantListBaseResponse> {
override fun onFailure(call: Call<RestaurantListBaseResponse>, t: Throwable) {
}
override fun onResponse(call: Call<RestaurantListBaseResponse>, response: Response<RestaurantListBaseResponse>) {
Log.d("debug","result found: ${response.body()!!.results_found}") // I can get the value
val x = response.body()!!.restaurants
Log.d("debug","list of resto: ${x.toString()}") // the properties is null
}
})
java или kotlin в порядке