Scala to JSON in Play Framework 2.1 Scala to JSON in Play Framework 2.1 json json

Scala to JSON in Play Framework 2.1


Play 2.1 JSON API does not provide a serializer for the Type Map[String, Ojbect].

Define case class and Format for the specific type instead of Map[String, Object]:

// { "val1" : "xxx", "val2" : ["a", "b", "c"] }case class Hoge(val1: String, val2: List[String])implicit val hogeFormat = Json.format[Hoge]

If you don't want to create case class.The following code provides JSON serializer/deserializer for Map[String, Object]:

implicit val objectMapFormat = new Format[Map[String, Object]] {  def writes(map: Map[String, Object]): JsValue =    Json.obj(      "val1" -> map("val1").asInstanceOf[String],      "val2" -> map("val2").asInstanceOf[List[String]]    )  def reads(jv: JsValue): JsResult[Map[String, Object]] =    JsSuccess(Map("val1" -> (jv \ "val1").as[String], "val2" -> (jv \ "val2").as[List[String]]))}

More dynamically

import play.api.libs.json._import play.api.libs.json.Reads._import play.api.libs.json.Json.JsValueWrapperimplicit val objectMapFormat = new Format[Map[String, Object]] {  def writes(map: Map[String, Object]): JsValue =     Json.obj(map.map{case (s, o) =>      val ret:(String, JsValueWrapper) = o match {        case _:String => s -> JsString(o.asInstanceOf[String])        case _ => s -> JsArray(o.asInstanceOf[List[String]].map(JsString(_)))      }      ret    }.toSeq:_*)  def reads(jv: JsValue): JsResult[Map[String, Object]] =    JsSuccess(jv.as[Map[String, JsValue]].map{case (k, v) =>      k -> (v match {        case s:JsString => s.as[String]        case l => l.as[List[String]]      })    })}

Sample code:

  val jv = Json.toJson(Map("val1" -> "xxx", "val2" -> List("a", "b", "c"), "val3" -> "sss", "val4" -> List("d", "e", "f")))  println(jv)  val jr = Json.fromJson[Map[String, Object]](jv)  println(jr.get)

The output:

> {"val1":"xxx","val2":["a","b","c"],"val3":"sss","val4":["d","e","f"]}> Map(val1 -> xxx, val2 -> List(a, b, c), val3 -> sss, val4 -> List(d, e, f))