在 Play for Scala 中返回未来列表 json
Returning future list in Play for Scala json
抱歉,这是一个简单的问题。我需要 return Json 方法中的 Action.async
结构,但是我不确定如何创建一个嵌入已经是未来的列表的未来。有什么建议么?
case class Clazz (a: Int, b: Int)
def index = Action.async {
val json = JsObject(Seq(
"x" -> JsString("1"),
"list" -> Json.toJson(getList) // this line does not compile
))
Ok(json)
}
def getList = Future {
val c1 = Clazz (1,1)
val c2 = Clazz (2,2)
val list = List(c1,c2)
list
}
更新:
添加了以下 Writes 对象:
implicit val cc: Writes[Clazz] = (
(JsPath \ "a").write[Int] and
(JsPath \ "b").write[Int]
) (unlift(Clazz.unapply))
您必须使用 map
函数来获取具有预期内容的新 Future:
def index = Action.async {
val eventualList: Future[List[Clazz]] = getList
eventualList.map { list: List[Clazz] =>
val json = JsObject(Seq(
"x" -> JsString("1"),
"list" -> Json.toJson(list)
))
Ok(json)
}
}
我通常更喜欢 for/yield 语法,这样如果您以后需要添加更多 Futures,您可以轻松扩展而无需深度嵌套的 maps 和 flatMaps。
def index = Action.async {
for {
list <- getList
} yield {
val json = JsObject(Seq(
"x" -> JsString("1"),
"list" -> Json.toJson(list)
))
Ok(json)
}
}
抱歉,这是一个简单的问题。我需要 return Json 方法中的 Action.async
结构,但是我不确定如何创建一个嵌入已经是未来的列表的未来。有什么建议么?
case class Clazz (a: Int, b: Int)
def index = Action.async {
val json = JsObject(Seq(
"x" -> JsString("1"),
"list" -> Json.toJson(getList) // this line does not compile
))
Ok(json)
}
def getList = Future {
val c1 = Clazz (1,1)
val c2 = Clazz (2,2)
val list = List(c1,c2)
list
}
更新:
添加了以下 Writes 对象:
implicit val cc: Writes[Clazz] = (
(JsPath \ "a").write[Int] and
(JsPath \ "b").write[Int]
) (unlift(Clazz.unapply))
您必须使用 map
函数来获取具有预期内容的新 Future:
def index = Action.async {
val eventualList: Future[List[Clazz]] = getList
eventualList.map { list: List[Clazz] =>
val json = JsObject(Seq(
"x" -> JsString("1"),
"list" -> Json.toJson(list)
))
Ok(json)
}
}
我通常更喜欢 for/yield 语法,这样如果您以后需要添加更多 Futures,您可以轻松扩展而无需深度嵌套的 maps 和 flatMaps。
def index = Action.async {
for {
list <- getList
} yield {
val json = JsObject(Seq(
"x" -> JsString("1"),
"list" -> Json.toJson(list)
))
Ok(json)
}
}