Search code examples
kotlindata-class

Convert string data representation back to Kotlin Data Class


In Kotlin how is possible to convert a data class from its string representation back to the actual data class without having to manually parse the string?

for example, I have the next data class where both Interest and EmploymentType are enums, being the second element a List.

data class DataFilter(val mainInterest: Interest, val employments: List<EmploymentType>)

with toString I can get the contents its string representation, but if I want to get it back to a data class, how is it done?


Solution

  • For this purpose, you need to use a serialization library. I recommend you use Kotlinx.serialization library. This will help you convert the data object into a JSON String and convert it back to the data object easily.

    You can follow the guideline to setup Kotlinx.serialization library.

    After the setup is done, look at the following example: I will define both enum classes Interest and EmploymentType, and the DataFilter class:

    import kotlinx.serialization.Serializable
    import kotlinx.serialization.decodeFromString
    import kotlinx.serialization.encodeToString
    import kotlinx.serialization.json.Json
    
    enum class Interest {
        SPORTS,
        BOOKS,
        TRAVEL,
        FOOD,
        TECHNOLOGY,
        ART,
        OTHER
    }
    
    enum class EmploymentType {
        FULL_TIME,
        PART_TIME,
        CONTRACT,
        FREELANCE,
        OTHER
    }
    
    @Serializable //You have to annotate your class as Serializable to make it works.
    data class DataFilter(
        val mainInterest: Interest,
        val employment: List<EmploymentType>
    )
    

    Notice that Interest and EmploymentType are not annotated as @Serializable because enums are Serializable by default, but if you defined any other normal classes to use with DataFilter, then you have to annotate them as well.

    Next, I will show you how conversions work:

    fun main() {
        val filter = DataFilter(
            mainInterest = Interest.BOOKS,
            employment = listOf(EmploymentType.FULL_TIME, EmploymentType.FREELANCE)
        )
    
    // Converting filter object into JSON String:
        val filterAsJsonString = Json.encodeToString(filter)
        println(filterAsJsonString) //prints {"mainInterest":"BOOKS","employment":["FULL_TIME","FREELANCE"]}
    
    //Convert JSON String back to data object:
        val filterAsDataObject: DataFilter = Json.decodeFromString(filterAsJsonString)
        println(filterAsDataObject) //prints DataFilter(mainInterest=BOOKS, employment=[FULL_TIME, FREELANCE])
    }