почему я получаю нулевое значение для свойств объекта, сопоставленных с помощью Retrofit и GSON конвертер? - PullRequest
0 голосов
/ 09 марта 2020

Я новичок в использовании 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 в порядке

1 Ответ

1 голос
/ 09 марта 2020

Просто удалите всю инициализацию из классов данных с помощью val. Или используйте var вместо val.

val значений, которые вы уже инициализируете, поэтому вы не можете переназначить их.

...