/ / Jerkson. Carte de sérialisation vers JsValue - scala, playframework-2.0, jerkson

Jerkson. Sérialisation de la carte dans JsValue - scala, playframework-2.0, jerkson

J'utilise jerson intégré avec playframework 2, et tout ce que je veux, c'est sérialiser la carte, contenant des valeurs de type différent:

object AppWriter extends Writes[Application] {
def writes(app: Application): JsValue = {
Json.toJson(Map(
"id" -> app.getId.toString,
"name" -> app.getName,
"users" -> Seq(1, 2, 3)
))
}
}

Dans ce cas j'ai:

No Json deserializer found for type scala.collection.immutable.Map[java.lang.String,java.lang.Object].
Try to implement an implicit Writes or Format for this type

La navigation dans le code du framework montre qu'il existe un sérialiseur pour les types Map [String, V] définition implicite mapWrites [V] .., mais je ne comprends pas pourquoi cela ne s'applique pas.

Quelqu'un peut-il m'aider?

UPD: J'ai trouvé une solution simple:

object AppWriter extends Writes[Application] {
def writes(app: Application): JsValue = {
Json.toJson(Map[String, JsValue](
"id" -> JsNumber(BigDecimal(app.getId)),
"name" -> JsString(app.getName),
"users" -> JsArray(Seq(1, 2, 3).map(x => JsNumber(x)))
))
}

}

mais ce n'est pas si élégant ...

Réponses:

1 pour la réponse № 1

Pour ce faire, la méthode standard consiste à créer un JsObject à partir des paires clé-valeur individuelles pour les champs, pas en plaçant les paires dans une carte. Par exemple, en supposant que votre Application ressemble à ça:

case class Application(getId: Int, getName: String)

Vous pouvez écrire:

import play.api.libs.json._, Json.toJson

implicit object AppWriter extends Writes[Application] {
def writes(app: Application): JsValue = JsObject(
Seq(
"id"    -> JsNumber(app.getId),
"name"  -> JsString(app.getName),
"users" -> toJson(Seq(1, 2, 3))
)
)
}

Et alors:

scala> toJson(Application(1, "test"))
res1: play.api.libs.json.JsValue = {"id":1,"name":"test","users":[1,2,3]}

Notez que vous n'avez pas besoin de préciser comment sérialiser le Seq[Int]-le défaut Format les instances feront le travail pour vous.