0

使用 Casbah,我查询 Mongo。

val mongoClient = MongoClient("localhost", 27017)
val db = mongoClient("test") 
val coll = db("test")
val results: MongoCursor = coll.find(builder) 

var matchedDocuments = List[DBObject]()
for(result <- results) {
  matchedDocuments = matchedDocuments :+ result
}

然后,我List[DBObject]通过以下方式将其转换为 JSON:

val jsonString: String = buildJsonString(matchedDocuments)

有没有更好的方法将“结果”(MongoCursor)转换为 JSON(JsValue)?

private def buildJsonString(list: List[DBObject]): Option[String] = {
  def go(list: List[DBObject], json: String): Option[String] = list match {
     case Nil => Some(json)
     case x :: xs if(json == "") => go(xs, x.toString)
     case x :: xs  => go(xs, json + "," + x.toString)
     case _ => None
  }

  go(list, "")
}
4

1 回答 1

1

假设您想要隐式转换(如 flavian 的回答),用逗号加入列表元素的最简单方法是:

private implicit def buildJsonString(list: List[DBObject]): String =
  list.mkString(",")

这基本上是Scala 给出的答案:join an iterable of strings

如果要包含方括号以正确构造 JSON 数组,只需将其更改为:

list.mkString("[", ",", "]") // punctuation madness

但是,如果您真的想像在原始问题中指出的那样使用 Play JsValue 元素,那么您可以这样做:

list.map { x => Json.parse(x.toString) }

哪个应该产生 aList[JsValue]而不是 a String。但是,如果您只是在发送响应时再次将其转换回字符串,那么这是一个不需要的步骤。

于 2013-09-07T00:48:13.783 回答