将MongoCursor转换为JSON

时间:2013-09-06 16:58:02

标签: mongodb scala casbah

使用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, "")
}

1 个答案:

答案 0 :(得分: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) }

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