使用 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()
}
}
我正在使用 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()
}
}