【问题标题】:Expected BEGIN_ARRAY but was BEGIN_OBJECT at path $预期为 BEGIN_ARRAY,但在路径 $ 处为 BEGIN_OBJECT
【发布时间】:2020-06-19 22:11:30
【问题描述】:

Interface

Json file looks like that

Error

Trying to retrieve these

interface StationService {
    @GET("/bus/nearstation/latlon/[lat]/[lon]/[distance].json")
    suspend fun getStationData(): Response<List<Station>>
}

.

答案 1 更改后:

for (station in it) {
                stationNames.append(station.street_name)
                    .append("\n")
            }

在 MainFragment.kt 中出现此错误: For-loop 范围必须有一个 'iterator()' 方法

【问题讨论】:

    标签: kotlin retrofit2 moshi


    【解决方案1】:

    基于响应的结构,您需要使用 Class wrapping List&lt;Station&gt;:应用以下更改:

        data class ResponseData(
             @SerializedName("data") val data: NearestStation
        )
    
        data class NearestStation(
             @SerializedName("nearststations") val nearestStations: List<Station>
        )  
    

    该站与您现在拥有的数据类相同。现在将改造服务更改如下:

        interface StationService {
        @GET("/bus/nearstation/latlon/[lat]/[lon]/[distance].json")
             suspend fun getStationData(): Call<ResponseData>
        }
    

    为什么? JSON 对象中的根对象由两个字段组成:String 类型的code(从示例中绕过)和data,这是一个对象,由一个名为neareststations 的字段组成,它是站点列表。您需要在数据类模型中遵循相同的对象结构。

    ---编辑:

    您需要在代码中更改以下内容:

    如果您对改造服务进行了我提到的更改,则需要更改类型

    val stationData = MutableLiveData<List<Station>>()
    

    val stationData = MutableLiveData<ResponseData>()
    

    改变

    val serviceData = service.getStationData().body()
    

    进入

    val serviceData = service.getStationData().execute().body()
    ```.
    
    Pay attention that ```serviceData`` is from type  ```ResponseData``` not ```List```  So replace ```?: emptyList()``` with mocked ```ResponseData``` 
    
    

    【讨论】:

    • 类型推断失败:没有足够的信息来推断 fun emptyList(): List 中的参数 T。
    • @WorkerThread 暂停 fun callWebService() { if (networkAvailable()) { val retrofit = Retrofit.Builder() .baseUrl(WEB_SERVICE_URL) .addConverterFactory(MoshiConverterFactory.create()) .build() val service = retrofit.create(StationService::class.java) val serviceData = service.getStationData().body() ?: emptyList() stationData.postValue(serviceData) } }
    • 我在回复的编辑部分添加了一些信息
    • 我按照你说的编辑了代码并得到了这个新错误:For-loop range must have an 'iterator()' method in mainFragment.kt
    • 它说it参数不是来自Iterable类型。换句话说,它不是数组或列表对象。在这一行:for (station in it).
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 2020-01-06
    • 2019-05-03
    • 2017-07-17
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多