验证POJO数据类是否被正确映射



我正在使用一个带有GSON的POJO数据类来解析从Firestore数据库调用的数据。

例如,我有一个POJO类,其中有几个非空值和可空值,如userID

data class Users(id:String="", userID:String="" ...)

然后我使用GSON来解析JSON数据到对象的类

val gson = Gson()
val jsonObjects = gson.toJson(querySnapshot.data)
val parseData = gson.fromJson(jsonObjects,Users::class.java)

我的问题是,如果有人在数据库中上传数据,忘记添加userID(即它是空的),是否有一种方法,我可以检查用户数据类被解析时是否有效?

我正在使用类似if(userID == "){返回false}的检查。但是,随着非空字段的数量增加,它变得乏味,必须有更好的方法来检查这一点。

我的问题是,如果有人在数据库中上传数据并忘记添加userID(即它是null),是否有一种方法可以检查用户数据类在被解析时是否有效?

如果你根本不想要null值,为什么要让用户提供不完整的数据呢?最简单的解决方案是限制添加到数据库中的数据。如何?只需创建一些约束。例如,如果用户没有填写所需的,他们就无法访问应用程序中的功能。字段。这是一种被广泛使用的操作。

如果您已经有空值,那么检查是否为空是您可以继续使用的解决方案。在Kotlin中,null安全可以通过多种方式处理,可以通过检查条件中的null,使用安全调用,elvis操作符,甚至使用!!运营商。

也许Kotlin的extension方法是一种可接受的方法。

让我展示一个演示,我假设类User看起来像这样:

data class User(
val id: String,
val userId: String?  // nullable
)

创建扩展方法User.isValid()验证需要的字段

fun User.isValid() = when {
userId.isNullOrEmpty() -> false
else -> true
}

方法isNullOrEmpty()是Kotlin的stdlib。我测试了代码,它工作正常。

val user1 = User("id 001", null)
val user2 = User("id 002", "userId 001")
println(user1.isValid()) //==> print false
println(user2.isValid()) //==> print true

现在,回到你担心的地方:

…但随着不可空字段数量的增加,它变得乏味了

我改变了User

data class User(
val id: String,
val userId: String?,
val email: String?,
val name: String?
)

表示当userIdemailname中任意一个字段为null时,表示User无效。只需在扩展方法中添加条件,如下所示:

fun User.isValid() = when {
userId.isNullOrEmpty()
|| email.isNullOrEmpty()
|| name.isNullOrEmpty() -> false

else -> true
}

我们只需要维护isValid的方法。

结论

  1. Kotlin扩展方法可以在你的情况下使用。
  2. 最好不要使用id="",如果需要,也可以为这个空字符串创建一个扩展方法。
fun String.Companion.empty() = ""
data class User(
val id: String,
val userId: String? = String.empty()
...
)
  1. 所有的扩展方法都可以放在一个类中,如UserExt.kt,以便于维护。

最新更新