Android-使用改造将值填充到已创建的POJO模型对象中

时间:2019-06-03 13:02:11

标签: android kotlin retrofit2

我有一个POJO模型对象“ apiResponse”,该对象具有来自先前API调用的值。

{
   "status":200,
   "userModel":{
                 ...SOME VARIABLES...
               },
   "otherContentRelatedToUserModel":{
                    ..SOME RELATED CONTENT..
                    }
}

此apiResponse具有一个“ UserModel”作为内部对象。

我要做什么是将这个“ apiResponse”对象传递给另一个响应为“ UserModel”的api调用,并使其仅更新APIResponse POJO对象中的UserModel对象。

目标是保持相关内容的单一来源,该内容可以根据应用程序中的交互而更改,但可能不会更新其余相关内容。

或者是否有可能至少更新一个已创建的pojo模型作为一个整体,从而更新模型中的变量值。

对此的原因::

在服务器中,API的内容在设置的时间内不会更改,主要是为了避免服务器上的流量过多。因此,必须在应用程序端实现一些逻辑。当前,使用数据库并不是一个切实可行的选择。

基本上通过另一个api调用更新已创建的POJO类对象的一部分。

使用改装在android(kotlin)中可能吗?还是有其他方法可以实现?

1 个答案:

答案 0 :(得分:0)

我认为无法使用UserModel来填充现有Retrofit对象中的其他字段,但是您可以使用GSON做一些魔术:

data class UserModel(
        val userId: Int? = null,
        val userName: String? = null)

class OtherContentRelatedToUserModel

data class ApiResponsePojo(
        val status: Int? = null,
        val userModel: UserModel? = null,
        val otherContentRelatedToUserModel: OtherContentRelatedToUserModel? = null)

class UserModelInstanceCreator(var userModelToUpdate: UserModel? = null)
    : InstanceCreator<UserModel> {
    override fun createInstance(type: Type?): UserModel {
        return userModelToUpdate ?: UserModel()
    }
}

val apiResponseJson =
        """
            {
                "status":200,
                "userModel":{
                    "userId": 1
                },
                "otherContentRelatedToUserModel":{
                }
            }
        """

val userModelResponseJson =
        """
            {
                "userName": "john wick"
            }
        """

val userModelInstanceCreator = UserModelInstanceCreator()

val gson = GsonBuilder()
        .registerTypeAdapter(UserModel::class.java, userModelInstanceCreator)
        .create()

val apiResponse: ApiResponsePojo = gson.fromJson(apiResponseJson, ApiResponsePojo::class.java)
userModelInstanceCreator.userModelToUpdate = apiResponse.userModel
gson.fromJson(userModelResponseJson, UserModel::class.java)

...
// apiResponse.toString() result
// ApiResponsePojo(status=200, userModel=UserModel(userId=1, userName=john wick)...