我使用内置的jerson和playframework 2,我想要的是序列化地图,包含不同类型的值:
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)
))
}
}
在这种情况下,我有:
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
Navigatin通过框架代码显示有Map [String,V]类型的序列化器隐式def mapWrites [V] ..但是我无法理解为什么它没有应用。
有人能帮助我吗?
UPD :我找到了简单的解决方法:
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)))
))
}
}
但这不是那么优雅......
答案 0 :(得分:1)
执行此操作的标准方法是从字段的各个键值对创建JsObject
- 而不是将对放入映射中。例如,假设您的Application
看起来像这样:
case class Application(getId: Int, getName: String)
你可以写:
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))
)
)
}
然后:
scala> toJson(Application(1, "test"))
res1: play.api.libs.json.JsValue = {"id":1,"name":"test","users":[1,2,3]}
请注意,您无需详细说明如何序列化Seq[Int]
- 默认Format
个实例将为您完成工作。