如何使用Retrofit2解析对象而不是数组

时间:2019-05-30 19:48:48

标签: android rest kotlin retrofit2

因此,我是一名开始的android开发人员,并且我正在使用retrofit2对我的API执行GET请求。但是我得到了一个“预期的begin_array但不是begin_object”。

我尝试在许多网站上阅读有关此问题的信息,但对我来说,其中没有一个对您有用,包括改造文档。

我尝试在kotlin中创建POJO类,并遵循此教程: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,但在第1行第2列$处为begin_object”

2 个答案:

答案 0 :(得分:1)

您的界面应返回响应,具体取决于响应

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

代替

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

答案 1 :(得分:0)

我已经解决了。 Taranjit Kaur的评估不仅正确,而且我拥有以下代码:

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

感叹号使我整天都在搜索错误。

谢谢大家。