首页 > 解决方案 > 使用 Moshi & Retrofit 将响应包装在另一个对象中

问题描述

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

我有这样的回应:

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

我的改造界面是这样的:

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

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

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

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

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

标签: androidretrofitmoshi

解决方案


似乎正在处理这个:

首先我写了一个注释:

@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()
    }
}

推荐阅读