Search code examples
jsonscalaplayframeworkplayframework-2.0

How to convert Scala Map into JSON String?


For example, I have this Map value in Scala:

val m = Map(
    "name" -> "john doe", 
    "age" -> 18, 
    "hasChild" -> true, 
    "childs" -> List(
        Map("name" -> "dorothy", "age" -> 5, "hasChild" -> false),
        Map("name" -> "bill", "age" -> 8, "hasChild" -> false)
    )
)

I want to convert it to its JSON string representation:

{
    "name": "john doe",
    "age": 18,
    "hasChild": true,
    "childs": [
        {
            "name": "dorothy",
            "age": 5,
            "hasChild": false
        },
        {
            "name": "bill",
            "age": 8,
            "hasChild": false
        }
    ]
}

I'm currenly working on Play framework v2.3, but the solution doesn't need to use Play JSON library, although it will be nice if someone can provide both Play and non-Play solution.

This is what I have done so far without success:

// using jackson library
val mapper = new ObjectMapper()
val res = mapper.writeValueAsString(m)
println(res)

Result:

{"empty":false,"traversableAgain":true}

I don't understand why I got that result.


Solution

  • As a non play solution, you can consider using json4s which provides a wrapper around jackson and its easy to use. If you are using json4s then you can convert map to json just by using:

    write(m)                                        
    //> res0: String = {"name":"john doe","age":18,"hasChild":true,"childs":[{"name":"dorothy","age":5,"hasChild":false},{"name":"bill","age":8,"hasChild":false}]}
    

    --Updating to include the full example--

    import org.json4s._
    import org.json4s.native.Serialization._
    import org.json4s.native.Serialization
    implicit val formats = Serialization.formats(NoTypeHints)
    
     val m = Map(
      "name" -> "john doe",
      "age" -> 18,
      "hasChild" -> true,
      "childs" -> List(
        Map("name" -> "dorothy", "age" -> 5, "hasChild" -> false),
        Map("name" -> "bill", "age" -> 8, "hasChild" -> false)))
    
     write(m)
    

    Output:

     res0: String = {"name":"john doe","age":18,"hasChild":true,"childs":[{"name" 
     :"dorothy","age":5,"hasChild":false},{"name":"bill","age":8,"hasChild":false }]}
    

    Alternative way:

    import org.json4s.native.Json
    import org.json4s.DefaultFormats
    
    Json(DefaultFormats).write(m)