使用 Moshi 从 Retrofit 调用中没有得到任何结果

Posted

技术标签:

【中文标题】使用 Moshi 从 Retrofit 调用中没有得到任何结果【英文标题】:Getting no result from Retrofit call using Moshi 【发布时间】:2021-10-25 12:06:24 【问题描述】:

我是 API 世界的新手。在尝试使用 Retrofit 和 Moshi 获取 API 时,看起来我得到了 0 个结果,这是我不应该的。谁能告诉我我做错了什么设置?

编辑:经过进一步调查,我实际上在调用 API 的视图模型中遇到了这个错误:

Expected BEGIN_ARRAY but was BEGIN_OBJECT at path $

我正在尝试获取的 API:

https://earthquake.usgs.gov/fdsnws/event/1/query?format=geojson&starttime=2021-01-01&endtime=2021-08-24&minmagnitude=4&latitude=24.0162182&longitude=90.6402874&maxradiuskm=400

这是我的 Retrofit 和 Moshi 设置:

private const val BASE_URL = "https://earthquake.usgs.gov/"

private val moshi = Moshi.Builder()
    .add(KotlinJsonAdapterFactory())
    .build()

private val retrofit = Retrofit.Builder()
    .addConverterFactory(MoshiConverterFactory.create(moshi))
    .baseUrl(BASE_URL)
    .build()

interface UsgsApiService 
    @GET("fdsnws/event/1/query")
    suspend fun getQuakes(
        @Query("format") format: String = "geojson",
        @Query("starttime") starttime: String = "2021-01-01",
        @Query("endtime") endtime: String = "2021-08-24",
        @Query("minmagnitude") minmagnitude: String = "4",
        @Query("latitude") latitude: String = "24.0162182",
        @Query("longitude") longitude: String = "90.6402874",
        @Query("maxradiuskm") maxradiuskm: String = "400"
    ): List<Quake>


object UsgsApi 
    val retrofitService: UsgsApiService by lazy 
        retrofit.create(UsgsApiService::class.java)
    

这是我的模型:

@JsonClass(generateAdapter = true)
data class Quake(
    @Json(name = "features")
    val features: List<Feature>
)

@JsonClass(generateAdapter = true)
data class Feature(
    @Json(name = "id")
    val id: String,
    @Json(name = "properties")
    val properties: Properties,
    @Json(name = "geometry")
    val geometry: Geometry
)

@JsonClass(generateAdapter = true)
data class Properties(
    @Json(name = "mag")
    val mag: Double?,
    @Json(name = "place")
    val place: String,
    @Json(name = "time")
    val time: Long,
    @Json(name = "url")
    val url: String
)

@JsonClass(generateAdapter = true)
data class Geometry(
    @Json(name = "coordinates")
    val coordinates: List<Double>
)

感谢您的帮助!

【问题讨论】:

【参考方案1】:

API 未返回 json 数组,但您尝试将其解析为具有 List&lt;&gt; 类型的数组。

API 返回的似乎是一个 GeoJSON FeatureCollection 对象,其 features 属性中包含地震数组,因此您的*** json 模型类应该是至少可以提取 features 数组的东西。

【讨论】:

谢谢!你能给我一个如何解决这个问题的例子吗?我是 Retrofit 的新手,不知道如何修复它。 没关系!将List&lt;Quake&gt; 更改为Quake 作为返回类型,我现在得到了结果。感谢您的帮助!

以上是关于使用 Moshi 从 Retrofit 调用中没有得到任何结果的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin Retrofit Moshi:不返回任何内容

使用 Moshi 和 Retrofit 将响应包装在另一个对象中

Moshi + Retrofit - 处理未知类型的 JSON 响应

使用 Moshi/Retrofit2 访问深度嵌套的 JSON 数组

常见的解析器(Gson 、Jackson 、wire、Moshi、Simple XML、Scalars )

Android REST API 调用,后端没有响应新记录