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

Wrapping a reponse in another object using Moshi & Retrofit

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

我有这样的回复:

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

我的改造界面是这样的:

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

因此,来自服务器的 returns 的 JSON 代表一个用户 dto。

事情是这样的:我不喜欢服务器有时 returns 某些对象直接作为 dto 的方式,而其他时候则不然。

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

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

似乎正在处理这个问题:

首先我写了一个注解:

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