使用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, "")
}
答案 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
。但是,如果您只是在发送响应时将其转换回字符串,那么这是一个不需要的步骤。