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

Posted

技术标签:

【中文标题】使用 Moshi 和 Retrofit 将响应包装在另一个对象中【英文标题】:Wrapping a reponse in another object using Moshi & Retrofit 【发布时间】:2021-05-24 21:35:44 【问题描述】:

我正在使用 Moshi(带有 Retrofit)将 JSON 映射到对象

我有这样的回应:


   "email:"test@gmail.com"
   "name":"test"

而我的改造界面是这样的:

@POST("login")
suspend fun login(@Body request: LoginRequest): UserDTO

因此,从服务器返回的 JSON 代表一个用户 dto。

事情是这样的:我不喜欢服务器有时会直接将某些对象作为 dto 返回,而有时则不会。

所以我想做的是始终拥有一个包含 dto 对象的 Response 对象(在本例中为 LoginResponse)

如何将直接返回的 dto 包装在响应对象中?我在想有某种 Root 注释,但不幸的是它不是那么简单,我之前从未使用过 Moshi

【问题讨论】:

【参考方案1】:

似乎正在处理这个问题:

首先我写了一个注释:

@Retention(AnnotationRetention.RUNTIME)
@JsonQualifier
annotation class RootUserDTO

然后我注释了我的Api接口:

@POST("login")
@RootUserDTO
suspend fun login(@Body request: LoginRequest): LoginResponse

最后我写了一个自定义适配器:

class RootUserDTOAdapter 
    @RootUserDTO
    @FromJson
    fun fromJson(userDTO: UserDTO): LoginResponse 
        return LoginResponse(userDTO)
    

    @ToJson
    fun toJson(@RootUserDTO loginResponse: LoginResponse): UserDTO 
        throw UnsupportedOperationException()
    

【讨论】:

以上是关于使用 Moshi 和 Retrofit 将响应包装在另一个对象中的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin Retrofit Moshi:不返回任何内容

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

在 Kotlin 中使用 Moshi 和 Retrofit 解析具有增量对象名称的 JSON

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

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

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