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))