首页 > 解决方案 > 如何在Scala中迭代Future List的结果?

问题描述

我是 Scala 的新手,正在尝试使用akka. 我正在尝试从 Scala 中的 MongoDB 访问数据,并希望将其转换为 JSON 和 XML 格式。下面附加的代码是使用路径/getJson并调用 getJson() 函数来获取未来形式的数据。

get {
  concat(
    path("getJson"){
      val f = Patterns.ask(actor1,getJson(),10.seconds)
      val res  = Await.result(f,10.seconds)
      val result = res.toString
      complete(res.toString)
    }
}

getJson() 方法如下:

def getJson()= {
  val future = collection.find().toFuture()
  future
}

我在文件中有一个 Greeting Case 类Greeting.scala

case class Greeting(msg:String,name:String)

和 MyJsonProtocol.scala 文件,用于将 scala 对象编入 JSON 格式,如下所示:

trait MyJsonProtocol extends SprayJsonSupport with DefaultJsonProtocol {
  implicit val templateFormat = jsonFormat2(Greeting)
}

complete(res.toString)在 Postman 中得到的输出为:

Future(Success(List(
  Iterable(
    (_id,BsonObjectId{value=5fc73944986ced2b9c2527c4}), 
    (msg,BsonString{value='Hiiiiii'}), 
    (name,BsonString{value='Ruchirrrr'})
  ),
  Iterable(
    (_id,BsonObjectId{value=5fc73c35050ec6430ec4b211}),
    (msg,BsonString{value='Holaaa Amigo'}), 
    (name,BsonString{value='Pablo'})), 
  Iterable(
    (_id,BsonObjectId{value=5fc8c224e529b228916da59d}), 
    (msg,BsonString{value='Demo'}), 
    (name,BsonString{value='RuchirD'}))
)))

有人可以告诉我如何迭代这个输出并以 JSON 格式显示它吗?

标签: scalaakkaconcurrent.futures

解决方案


首先,不要打电话toStringcomplete(res.toString)

正如AkkaHTTP json support guide中所说,如果您设置正确,您的案例类将自动转换为 json。

但正如我在输出中看到的,你res不是一个Greeting类型的对象。看起来它与 有某种关系,Greeting并且具有相同的结构。似乎是 MongoDB 请求的原始输出。如果这是一个正确的假设,您应该将 MongoDB 的原始输出转换为您的Greeting案例类。我想它可以在getJson() after完成collection.find()


推荐阅读