Home > Software design >  Verify if POJO data class was mapped correctly
Verify if POJO data class was mapped correctly

Time:09-28

I am using a POJO data class with GSON to parse the data which is being called from the Firestore database.

For example, I have a POJO class with few non-nullable, and nullable values like userID

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

I am then using GSON to parse the JSON data to object for that class

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

My question is if someone uploads data in the database and forgets to add the userID (i.e. it is null), is there a way I can check if the User data class is valid when being parsed?

I am using a check like if(userID == ""){return false} . But as the number of non-nullable fields grows it gets tedious and there must be a better way to check this.

CodePudding user response:

Maybe the extension method of Kotlin is an accepted approach.

Let me show a demo, I assume the class User looks like this:

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

Create a extension method User.isValid() to verify the fields you want.

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

The method isNullOrEmpty() is in stdlib of Kotlin. I test the code, it works fine.

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

Now, back to your worry point:

...But as the number of non nullable fields grow it gets tedious

I changed the class User

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

it means that when the fields of userId, email, name, any of them is null, the User is invalid. Just add conditions in extention method, like this:

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

We just need to maintain the method of isValid.

conclusion

  1. Kotlin Extension Method can be used in your case.
  2. It's better don't use id="", also can create an extension method for this empty string if need.
fun String.Companion.empty() = ""
data class User(
    val id: String,
    val userId: String? = String.empty()
    ...
)
  1. All the extension methods can be placed in a class, like UserExt.kt for easy maintaining.

CodePudding user response:

My question is if someone uploads data in the database and forgets to add the userID (i.e. it is null), is there a way I can check if the User data class is valid when being parsed?

If you don't want to have null values at all, why would you then let the user the possibility to provide incomplete data? The simplest solution would be to restrict the data that is added to the database. How? Simply by creating some constraints. For example, your users cannot get access to a feature in your app if they do not fill in all the required fields. That's an operation that is widely used.

If you already have null values, then checking against nullity is a solution you can go ahead with. In Kotlin, null safety can be handled in many ways, either by checking for null in conditions, using safe calls, elvis operator or even using the !! operator.

  • Related