2012-08-16 11 views
10

¡Estoy aprendiendo scala y mongodb en este momento y usando la obra! marco, así que estoy cometiendo todo tipo de errores a medida que entiendo las cosas. Actualmente tengo un objeto scala que devuelve una lista de objetos de base de datos devueltos de una consulta de mongodb a través de casbah de la siguiente manera;Cómo convertir la lista de casbah mongodb a json en scala/play

object Alerts { 

    def list() : List[DBObject]= { 

     val collection = MongoDatabase.collection; 
     val query = MongoDBObject.empty 
     val order = MongoDBObject("Issue Time:" -> -1) 
     val list = collection.find(query).sort(order).toList 
     list 
    } 

... }

En otra parte de mi código que desee enviar la lista de objetos JSON - por lo que tengo;

val currentAlerts = Alerts.list() 

Lo que me gustaría escribir es algo así como;

val resultingJson = currentAlerts.toJson 

Pero cuando hago esto, comprensiblemente recibo el siguiente error;

value toJson is not a member of List[com.mongodb.casbah.Imports.DBObject] 

Mi pregunta es - ¿cuál es la forma correcta de convertir una lista de com.mongodb.casbah.Imports.DBObject en JSON para la producción?

EDIT:

Para mayor claridad, lo que realmente quiero hacer es el equivalente de

val listInJson = collection.find(query).sort(order).toJson 

De la misma manera que yo pueda escribir

val listAsString = collection.find(query).sort(order).toString 
+0

Quizás quiso probar el 'Json.toJson() 'función? (http://www.playframework.org/documentation/2.0.2/ScalaJson) –

+1

¿por qué realmente necesita convertir los datos como json? Se almacena como json en db (realmente bson en realidad), ¿realmente necesitas lo mismo? Creo que es posible que desee copiar datos en un objeto en función de la estructura que desee y luego serializarlos en json ... – aishwarya

+1

Necesito mostrarlo como JSON para que lo consuma un servicio web. – Roger

Respuesta

4

tengo lo que es una solución horrible de la siguiente manera;

val currentAlerts = Alerts.list() 

var jsonList : List[JsValue] = Nil 

// Iterate over the DBObjects and use to String to convert each to JSON 
// and then parse that back into the list so we can use toJson on it later. 
// MAD, but works. 

for (dbObject <- currentAlerts) { 
    jsonList ::= Json.parse(dbObject.toString) 
} 

val result = Json.toJson(jsonList) 
Ok(result).as("application/json") 

Seguramente hay una manera mejor?

+0

Hola Roger, ¿alguna vez encontraste una mejor forma de convertir casbah DBObject al JsValue de la obra? – teo

+0

Después de obtener 'resultado', ¿cómo llenaría sus campos de valor clave en un mapa? –

+0

¡Esta es una idea brillante! Si el rendimiento no importa (por ejemplo, en impresión bonita, no es así), esto es perfecto. Gracias. – akauppi

5

Tengo el siguiente

def service() = Action { 
// connect 
val collection = MongoConnection()("someDB")("someCollection") 
// simply convert the result to a string, separating items with a comma 
// this string goes inside an "array", and it's ready to hit the road 
val json = "[%s]".format(
    collection.find(someQuery).toList.mkString(",") 
) 

Ok(json).as("application/json") 

}

7

Usted puede intentar

com.mongodb.util.JSON.serialize(Alerts.list()) 

Esto debería devolver una matriz JSON con sus alertas