Попытка получить данные о расстоянии от матрицы расстояния API всегда возвращает NULL - PullRequest
0 голосов
/ 06 февраля 2020

Извините за плохой английский sh. Я пытаюсь получить доступ к данным о расстоянии, используя модификацию и Моши для анализа json, вот ответ json

{
    "destination_addresses": [
        "Jl. Juanda 7A No.3, Air Hitam, Kec. Samarinda Ulu, Kota Samarinda, Kalimantan Timur 75243, Indonesia"
    ],
    "origin_addresses": [
        "Jl. Dayak Modang No.28, Sempaja Sel., Kec. Samarinda Utara, Kota Samarinda, Kalimantan Timur 75131, Indonesia"
    ],
    "rows": [
        {
            "elements": [
                {
                    "distance": {
                        "text": "2.9 mi",
                        "value": 4687
                    },
                    "duration": {
                        "text": "11 mins",
                        "value": 651
                    },
                    "status": "OK"
                }
            ]
        }
    ],
    "status": "OK"
}

, а вот мой метод дооснащения и метод getDistance, который я использую

//THIS CALL IS INSIDE COUROUTINE SCOPE
RetrofitBuilder(ConstantUtil.DISTANCE_API_URL).apiService.getDistance(origin = "${param[0]},${param[1]}", destination = "${param[2]},${param[3]}")

//GET DISTANCE METHOD
@GET("maps/api/distancematrix/json")
    suspend fun getDistance(
        @Query(value = "units") units: String = "metric",
        @Query(value = "origins") origin: String,
        @Query(value = "destinations") destination: String,
        @Query(value = "key") key: String = ConstantUtil.API_KEY
    ): DistanceResponseData

а вот DistanceResponseData "POJO", который я использую

data class DistanceResponseData (
    @field:Json(name = "rows") val rows: List<Rows>
)

data class Rows (
    @field:Json(name = "elements") val elements: List<Elements>
)

data class Elements (
    @field:Json(name = "distance") val distance: ItemData,
    @field:Json(name = "duration") val duration: ItemData,
    @field:Json(name = "status") val status: String
)

data class ItemData (
    @field:Json(name = "text") val rawText: String,
    @field:Json(name = "value") val rawValue: Int
)

, если я регистрирую возвращенный ответ от вызова, я получаю все необходимые данные, от строк до данных внутри элементов, но когда я пытаюсь получить доступ только расстояние от элемента object, оно всегда возвращает нулевое значение, см. код ниже.

//Here's when i log the DistanceResponseData object returned from call (got all data i need)
2020-02-06 13:42:55.232 20358-20358/com.vjtechsolution.kurir.service I/System.out: debug: distance data DistanceResponseData(rows=[Rows(elements=[{distance={text=4.9 km, value=4887.0}, duration={text=13 mins, value=766.0}, status=OK}])])

//But when im trying to access only the distance data using ${distanceData.rows[0].elements[0], it return null value for everything, even the DistanceResponseData log that worked before became null
2020-02-06 13:47:07.515 21107-21107/com.vjtechsolution.kurir.service I/System.out: debug: distance data DistanceResponseData(rows=[Rows(elements=[Elements(distance=null, duration=null, status=OK)])])
2020-02-06 13:47:07.516 21107-21107/com.vjtechsolution.kurir.service I/System.out: debug: distance elements Elements(distance=null, duration=null, status=OK)

//below code i use for logging the result
println("debug: distance data $distanceData")
println("debug: distance elements ${distanceData.rows[0].elements[0]}")

Может кто-нибудь объяснить, почему это произошло? и как это исправить? Прошло 2 дня, я застрял с этой проблемой.

Спасибо

1 Ответ

1 голос
/ 06 февраля 2020

Я вижу, что вам не хватает некоторой информации, т.е. у вас нет правильной аннотации над классом. Вот хороший гид. https://proandroiddev.com/getting-started-using-moshi-for-json-parsing-with-kotlin-5a460bf3935a

...