Как разобрать объект вместо массива с помощью retrofit2 - PullRequest
0 голосов
/ 30 мая 2019

Итак, я начинающий разработчик Android и использую retrofit2 для выполнения запроса GET к моему API. Однако я получаю «ожидаемый массив begin_array, но был begin_object».

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

Я попытался создать класс POJO в kotlin и после этого урока: https://www.freshbytelabs.com/2018/05/how-to-fix-expected-beginarray-but-was.html.

Но я просто теряюсь, когда автор использует переменные, которые я не вижу объявленными в своем коде. Так что скопировать / вставить пример не получилось. Может быть, потому что я глупый, но я был бы признателен за любую помощь.

Ожидаемый ответ JSON (протестировано с почтальоном):

{
    "value": [
        {
            "id": 1,
            "uniqueId": "1b97653d-bafe-461f-b609-72ab6795737f",
            "code": "NL",
            "description": "something",
            "isActive": true,
            "dateCreated": "2019-04-12T22:41:28.4966667",
            "dateModified": "2019-04-12T22:41:28.4966667",
            "dateExpired": "9999-12-31T00:00:00",
            "timestamp": "AAAAAAAAB9E=",
            "responseUserList": []
        }
    ],
    "success": true,
    "errorCode": null,
    "errorMessage": null
}

Это моя главная:

var restLanguageService = Retrofit.Builder()
            .baseUrl("https://30cookweb20190412110132.azurewebsites.net/")
            .addConverterFactory(GsonConverterFactory.create())
            .build()
        var service = restLanguageService.create(RequestInterface::class.java)

        var call = service.getAllLanguages()

        call.enqueue(object: Callback<List<RequestInterface>>
        {
            override fun onResponse(call: Call<List<RequestInterface>>, response: Response<List<RequestInterface>>)
            {
                var restLanguages = response.body().toString()
                if (!response.isSuccessful)
                {
                    for (RestLanguage in restLanguages)
                        textView.text = "Code: " + response.code()
                    return
                }
            }

            override fun onFailure(call: Call<List<RequestInterface>>, t: Throwable)
            {
                textView.text = t.message
            }
        })

Мой интерфейс:

interface RequestInterface
{
    @GET("api/language/getalllangaugesasync")
    fun getAllLanguages(): Call<List<RequestInterface>>
}

Мой класс данных:

data class LanguageResponse(
    @SerializedName("errorCode")
    @Expose
    private val errorCode: Any,
    @SerializedName("errorMessage")
    @Expose
    private val errorMessage: Any,
    @SerializedName("success")
    @Expose
    private val success: Boolean,
    @SerializedName("languageValue")
    @Expose
    private val value: List<Value>
)

Это моя строка, напечатанная в textView:

"ожидаемый begin_array, но был begin_object в строке 1, столбец 2, путь $"

Ответы [ 2 ]

1 голос
/ 30 мая 2019

Ваш интерфейс должен возвращать ответ, который согласно деталям должен быть

    interface RequestInterface
{
    @GET("api/language/getalllangaugesasync")
    fun getAllLanguages(): Call<LanguageResponse>
}

вместо

    interface RequestInterface
{
    @GET("api/language/getalllangaugesasync")
    fun getAllLanguages(): Call<List<RequestInterface>>
}
0 голосов
/ 31 мая 2019

Я решил это.Таранджит Каур был не только прав в своих оценках, но также у меня был такой код:

if (!response.isSuccessful)
                {
                    for (RestLanguage in restLanguages)
                        textView.text = "Code: " + response.code()
                    return
                }

Восклицательный знак заставил меня весь день искать свою ошибку.

Спасибо всем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...