在Play for Scala json中返回未来的列表

时间:2016-11-27 16:18:02

标签: scala playframework playframework-2.5

如果这是一个简单的问题,请道歉。我需要在Action.async方法中返回Json结构,但是我不确定如何创建嵌入已经是未来的列表的未来。有什么建议?

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

2 个答案:

答案 0 :(得分:3)

您必须使用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)
  }
}

答案 1 :(得分:3)

我通常更喜欢for / yield语法,因此如果您以后需要添加更多Futures,则可以轻松扩展而无需深度嵌套的地图和flatMaps。

def index = Action.async {
   for {
       list <- getList
   } yield {
       val json = JsObject(Seq(
            "x" -> JsString("1"),
            "list" -> Json.toJson(list)
       ))
       Ok(json)
    }
}