2012-08-16 7 views
10

Sto imparando scala e mongodb al momento e usando il gioco! quadro, quindi sto facendo tutti i tipi di errori mentre mi capita di capire le cose. Attualmente ho un oggetto scala che restituisce una lista di oggetti di database restituiti da una query di mongodb tramite casbah come segue;Come convertire la lista di casbah mongodb a json in 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 
    } 

...}

Altrove nel mio codice desidero uscita l'elenco degli oggetti in JSON - così ho;

val currentAlerts = Alerts.list() 

Quello che mi piacerebbe scrivere è qualcosa di simile;

val resultingJson = currentAlerts.toJson 

Ma quando faccio questo, ho comprensibilmente il seguente errore;

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

La mia domanda è - qual è il modo giusto per convertire un elenco di com.mongodb.casbah.Imports.DBObject in JSON per l'uscita?

EDIT:

Per chiarezza, quello che voglio veramente fare è l'equivalente di

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

Nello stesso modo in cui posso scrivere

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

Hai provato il 'Json.toJson() 'funzione? (http://www.playframework.org/documentation/2.0.2/ScalaJson) –

+1

bene perché hai davvero bisogno di convertire i dati come json? E 'memorizzato come json in db (beh davvero bson), hai davvero bisogno della stessa schiena? Penso che si possa semplicemente voler copiare i dati in un oggetto in base alla struttura desiderata e quindi serializzarli in json ... – aishwarya

+1

Ho bisogno di emetterlo come JSON per un webservice da consumare. – Roger

risposta

4

ho quello che è un soluzione orrenda come segue;

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") 

Ci deve essere sicuramente un modo migliore?

+0

Ehi Roger, hai mai trovato un modo migliore per convertire la casbah DBObject in JsValue? – teo

+0

Dopo aver ottenuto 'risultato', come si popoleranno i suoi campi valore-chiave in una mappa? –

+0

Questa è davvero un'idea geniale! Se le prestazioni non sono importanti (ad esempio nella stampa carina no), questo è perfetto. Grazie. – akauppi

5

Ho il seguente

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

Si può provare

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

Ciò dovrebbe restituire un array di JSON con i vostri avvisi