Kotlin Ошибка дооснащения "Ожидается BEGIN_ARRAY, но было BEGIN_OBJECT" - PullRequest
0 голосов
/ 13 апреля 2020

Я прочитал несколько постов в StackOverflow, но пока не нашел решения, подходящего для моей проблемы. Не могли бы вы помочь мне исправить эту ошибку Retrofit?

JSON ответ:

{
"products": [
    {
        "barcode_number": "8000040000802",
        "barcode_type": "EAN",
        "barcode_formats": "EAN 8000040000802",
        "mpn": "",
        "model": "",
        "asin": "",
        "product_name": "Campari Bitter 25% Vol. 1 L",
        "title": "",
        "category": "Food, Beverages & Tobacco > Beverages > Alcoholic Beverages > Bitters",
        "manufacturer": "Campari",
        "brand": "Campari",
        "label": "",
        "author": "",
        "publisher": "",
        "artist": "",
        "actor": "",
        "director": "",
        "studio": "",
        "genre": "",
        "audience_rating": "",
        "ingredients": "",
        "nutrition_facts": "",
        "color": "",
        "format": "",
        "package_quantity": "",
        "size": "",
        "length": "",
        "width": "",
        "height": "",
        "weight": "",
        "release_date": "",
        "description": "",
        "features": [],
        "images": [
            "https://images.barcodelookup.com/19631/196313718-1.jpg"
        ],
        "stores": [
            {
                "store_name": "Rakuten Deutschland GmbH",
                "store_price": "16.50",
                "product_url": "https://www.rakuten.de/produkt/campari-bitter-25-vol-1-l-1826679605",
                "currency_code": "EUR",
                "currency_symbol": "€"
            }
        ],
        "reviews": []
    }
]
}

Классы данных, созданные плагином от JSON до Kotlin:

data class BaseResponse(
   val products: List<Product>
)

Продукт:

data class Product(
    val actor: String,
    val artist: String,
    val asin: String,
    val audience_rating: String,
    ...
)

Магазин:

data class Store(
    val currency_code: String,
    val currency_symbol: String,
    val product_url: String,
    val store_name: String,
    val store_price: String
)

Сервис:

interface BarcodeLookupApiService {
    @GET("products")
    suspend fun getArticleData(@Query("barcode") barcode: String,
                               @Query("key") key: String): List<BaseResponse>
}

Модификатор Builder:

object RetrofitBuilder {
    private const val BASE_URL = "https://api.barcodelookup.com/v2/"

    private fun getRetrofit(): Retrofit {
        return Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build()
    }

    val apiService: BarcodeLookupApiService =
        getRetrofit().create(BarcodeLookupApiService::class.java)
}

Разве классы данных, созданные плагином, не так? Или мой сервис не должен возвращать список? Я попытался вернуть простой объект BaseResponse, но он тоже не работает.

1 Ответ

0 голосов
/ 13 апреля 2020

Измените ваш интерфейс, как показано ниже:

interface BarcodeLookupApiService {
    @GET("products")
    suspend fun getArticleData(@Query("barcode") barcode: String,
                               @Query("key") key: String): BaseResponse
}

и получите список продуктов, как показано ниже:

baseRespose.ProductsList

Это решит вашу проблему. Ответ является объектом с массивом внутри объекта. Следовательно вы получаете ошибку.

...