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

暗黙的な変換が必要であると仮定すると(フラビアンの答えのように)、リストの要素をコンマで結合する最も簡単な方法は次のとおりです。

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

これは基本的にScala で与えられた答えです: 文字列の iterable を結合します

角かっこを含めて JSON 配列を適切に作成する場合は、次のように変更します。

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

ただし、元の質問で示されているように、実際に JsValue 要素を再生したい場合は、次のようにすることができます。

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

List[JsValue]の代わりに を生成する必要がありStringます。ただし、応答を送信するときに再度文字列に変換するだけの場合は、不要な手順です。

于 2013-09-07T00:48:13.783 に答える