Преобразование MongoCursor в JSON

Используя 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, "")
}

person Kevin Meredith    schedule 06.09.2013    source источник


Ответы (1)


Предполагая, что вы хотите неявное преобразование (например, в ответе Флавиана), самый простой способ соединить элементы вашего списка с запятыми:

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

Это в основном ответ, данный в Scala: присоединиться к итерации строк

Если вы хотите включить квадратные скобки для правильного построения массива JSON, вы просто измените его на:

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

Однако, если вы действительно хотите получить элементы Play JsValue, как вы, кажется, указываете в исходном вопросе, вы можете сделать:

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

Что должно давать List[JsValue] вместо String. Однако, если вы просто собираетесь снова преобразовать его в строку при отправке ответа, то это ненужный шаг.

person Rev. C. Bennett Hoffman    schedule 07.09.2013
comment
mkString очень помог мне здесь. Это лучше, чем мой метод - спасибо. - person Kevin Meredith; 07.09.2013