stringkotlindictionarynested-map

How to convert map and nested map to string and vise versa in Kotlin?


I have no idea how to convert HashMap and nested Hashmap to string and vise versa:

I use Room to save data in a local database. The "users " hashmap is a parameter of the data class. To save this parameter "users " in the Room database, we must convert it to a primitive such as string, boolen, Integer, etc. Room does not support object references, so type converters are required.

val users = HashMap<String, HashMap<String, Any>>()

    val user1 = HashMap<String, Any>()
    user1["filter"] = 0
    user1["group"] = "groupId"
    user1["labelsVisibility"] = true
    user1["sort"] = 1
    user1["view"] = 3
    users["user1"] = user1

    val user2 = HashMap<String, Any>()
    user2["filter"] = 0
    user2["group"] = "groupId"
    user2["labelsVisibility"] = true
    user2["sort"] = 1
    user2["view"] = 3
    users["user2"] = user2

Solution

  • As I said earlier in the comments, it could be easily done with Gson library:

    // Configure Gson
    val gson = GsonBuilder()
        // Using this strategy Gson first tries converting number to Long. 
        // If it fails (number is float), then it tries converting to Double
        .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) 
        .create()
    
    // Convert to JSON string
    val jsonString = gson.toJson(users)
    println("JSON => $jsonString")
    
    // Store at Room as a string...
    // Fetch later from Room as a string...
    
    val type = object : TypeToken<HashMap<String, HashMap<String, Any>>>() {}.type
    val fromJsonMap: HashMap<String, HashMap<String, Any>> = gson.fromJson(jsonString, type)
    
    println("ORIGINAL MAP =>\n$users")
    println("RESTORED MAP =>\n$fromJsonMap")
    

    Output:

    JSON => {
      "user1": {
        "filter": 0,
        "view": 3,
        "labelsVisibility": true,
        "sort": 1,
        "group": "groupId"
      },
      "user2": {
        "filter": 0,
        "view": 3,
        "labelsVisibility": true,
        "sort": 1,
        "group": "groupId"
      }
    }
    
    ORIGINAL MAP =>
    {user1={filter=0, view=3, labelsVisibility=true, sort=1, group=groupId}, user2={filter=0, view=3, labelsVisibility=true, sort=1, group=groupId}}
    RESTORED MAP =>
    {user1={filter=0, view=3, labelsVisibility=true, sort=1, group=groupId}, user2={filter=0, view=3, labelsVisibility=true, sort=1, group=groupId}}
    

    As you can see both original Map users and restored Map fromJsonMap are identical.