使Kotlin串行器与Retrofit配合使用 [英] Make Kotlin Serializer work with Retrofit

查看:45
本文介绍了使Kotlin串行器与Retrofit配合使用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我无法使Kotlin串行器与Retrofit一起工作。我正在使用com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.5.0包和改装。

数据类

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable


@Serializable
data class YelpSearchResult(
    @SerialName("total") val total: Int,
    @SerialName("businesses") val restaurants: List<YelpRestaurant>
)

data class YelpRestaurant(
    val name: String,
    val rating: Double,
    val price: String,
    @SerialName("review_count") val numReviews: Int,
    @SerialName("distance") val distanceInMeters: Double,
    @SerialName("image_url") val imageUrl: String,
    val categories: List<YelpCategory>,
    val location: YelpLocation
) {

    fun displayDistance(): String {
        val milesPerMeter = 0.000621371
        val distanceInMiles = "%.2f".format(distanceInMeters * milesPerMeter)
        return "$distanceInMiles mi"
    }
}

data class YelpCategory(
    val title: String
)

data class YelpLocation(
    @SerialName("address1") val address: String
)

服务接口

public interface YelpService {
    @GET("businesses/search")
    fun searchRestaurants(
        @Header("Authorization") authHeader: String,
        @Query("term") searchTerm: String,
        @Query("location") location: String): Call<YelpSearchResult>
}

活动

    val contentType = MediaType.get("application/json")
    val retrofit = Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(Json.asConverterFactory(contentType))
            .build()

    val yelpService = retrofit.create(YelpService::class.java)


    yelpService.searchRestaurants("Bearer ${api_key}",
        "Something", "Some Location").enqueue(
            object: Callback<YelpSearchResult> {
                override fun onFailure(call: Call<YelpSearchResult>, t: Throwable) {
                    Log.d("MainActivity", "err ${t}")

                }
                override fun onResponse(call: Call<YelpSearchResult>, response: Response<YelpSearchResult>) {
                    Log.d("MainActivity", "succ ${response}")
                }
            }
    )

运行时抛出的异常为

java.lang.RuntimeException:无法启动活动 ComponentInfo{com.xx.xx/com.xx.xx.MainActivity}: java.lang.IllegalArgumentException:无法为创建转换器 com.xx.xx.YelpSearchResult类

无法为类com.xx.xx.YelpSearchResult创建转换器 对于方法YelpService.searchRestaurants

原因:kotlinx.seralization.SerializationException:找不到 YelpSearchResult类的无参数序列化程序。对于通用 类,如列表,请显式提供序列化程序。

我做错了什么?感谢您的指点。

推荐答案

您忘记将@Serializable批注放在YelpRestaurant上面

@Serializable
data class YelpRestaurant {
...
}

YellCategoryYelpLocation也应该有批注。

这篇关于使Kotlin串行器与Retrofit配合使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆