【问题标题】:Verify if POJO data class was mapped correctly验证 POJO 数据类是否正确映射
【发布时间】:2021-11-20 02:14:34
【问题描述】:

我正在使用带有 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)

我的问题是如果有人在数据库中上传数据并且忘记添加用户ID(即它为空),有没有办法可以检查用户数据类在解析时是否有效?

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

【问题讨论】:

    标签: android firebase kotlin google-cloud-platform google-cloud-firestore


    【解决方案1】:

    也许 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的字段为空时,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,便于维护。

    【讨论】:

    • 感谢您的回复,但我正在尝试检查不可为空的值。用户 ID:字符串不可为空。此外,当从 firebase 解析数据时,我将需要数据类的默认构造函数,因此我无法将数据类初始化为 userID:String 但必须执行类似 userID:String = "" 的操作。
    【解决方案2】:

    我的问题是如果有人在数据库中上传数据并忘记添加用户ID(即它为空),有没有办法在解析时检查用户数据类是否有效?

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

    如果您已经有空值,那么检查空值是您可以继续使用的解决方案。在 Kotlin 中,null safety 可以通过多种方式处理,通过checking for null in conditions、使用safe callselvis operator 甚至使用the !! operator

    【讨论】:

    • 是的,检查已经到位,但是因为这是一个多平台应用程序,例如 web 开发人员忘记添加此检查并且数据库更新为空值我想处理异常好吧。是的,应用程序中存在空值检查,但我想知道 Data 对象是否有效。如果它无效,则执行其他操作毫无价值。
    • 正如问题中所解释的,我有 if(userID == ""){return false} 来检查它是否为空/空。只是想知道如果我们必须检查多个字段是否有更优雅的解决方案。
    • 当您必须处理文档中的空值时,您应该始终考虑检查空值。据我所知,目前还没有比 Kotlin 编程语言已经提供的更好的东西。
    • 嘿,lyncx!我可以帮助您了解其他信息吗?如果您认为我的回答对您有所帮助,请考虑通过单击左侧投票箭头下方的复选标记(✔️)来接受它。应将颜色更改为绿色。我真的很感激。谢谢!
    • 感谢您提供的信息,虽然是一个有效且合理的答案,但我认为它仍然没有使我的疑问清楚。我仍在研究这件事,会给出一个赞成票,但会保留一个接受的答案,直到我弄清楚这一点。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 2011-04-25
    • 1970-01-01
    相关资源
    最近更新 更多