使用Kotlin Retrofit调用Spotify API获取新专辑返回空字段问题
解决Spotify new-releases接口返回字段全为null的问题
核心原因:数据类结构与API响应不匹配
Spotify的new-releases接口返回的JSON结构外层包含一个albums对象,你的Albums数据类直接对应了albums内部的字段,但没有处理外层的包裹结构,导致序列化时无法匹配到数据,所有字段返回null。
具体修复步骤
1. 修正数据类结构
新增一个外层响应类,用来匹配API返回的完整结构:
@kotlinx.serialization.Serializable data class NewReleasesResponse( val albums: Albums ) @kotlinx.serialization.Serializable data class Albums( val limit: Int, val next: String?, // 注意:next/previous可能为null,建议设为可空类型 val previous: String?, val total: Int, val items: List<Album> ) // 确保Album数据类字段与Spotify返回的专辑结构匹配,示例: @kotlinx.serialization.Serializable data class Album( val id: String, val name: String, val artists: List<Artist>, // 其他需要的字段 ) @kotlinx.serialization.Serializable data class Artist( val id: String, val name: String )
2. 更新Retrofit接口返回类型
将getAlbums方法的返回类型改为新的外层响应类:
interface SpotifyApiService { @GET("browse/new-releases") suspend fun getAlbums( @Query("limit") limit: Int, @Header("Authorization") authorization: String ): NewReleasesResponse // 获取授权令牌的接口保持不变 @POST("api/token") @FormUrlEncoded suspend fun getToken( @Header("Authorization") auth: String, @Header("Content-Type") content: String, @Field("grant_type") grantType: String ): TokenResponse }
3. 验证序列化配置与授权头
- 确保Retrofit已正确配置kotlinx.serialization转换器:
val json = Json { ignoreUnknownKeys = true } // 忽略API返回中未定义的字段,避免序列化失败 val retrofit = Retrofit.Builder() .baseUrl("https://api.spotify.com/v1/") .addConverterFactory(json.asConverterFactory("application/json".toMediaType())) .build()
- 确认授权头格式正确:传入的
authorization参数必须是"Bearer ${获取到的token}",不能只传token字符串。
4. 调试建议
可以先通过Postman或curl调用接口,确认返回的JSON结构,再对比数据类字段是否完全匹配,尤其是字段名和可空性。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

