2012-08-16 8 views
10

Ich lerne scala und mongodb derzeit und mit dem Spiel! Rahmen, also mache ich alle möglichen Fehler, während ich mich um Dinge kümmere. Zur Zeit habe ich ein scala-Objekt, das eine Liste von Datenbankobjekten zurückgibt, die von einer mongodb-Anfrage über Casbah wie folgt zurückgegeben wurden:Wie zu konvertieren casbah mongodb list zu 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 
    } 

... }

An anderer Stelle in meinem Code möchte ich die Liste der Objekte in Json ausgeben - so habe ich;

val currentAlerts = Alerts.list() 

Was ich schreiben möchte, ist etwas wie;

Aber wenn ich dies tue, bekomme ich verständlicherweise den folgenden Fehler;

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

Meine Frage ist - was ist der richtige Weg, um eine Liste der com.mongodb.casbah.Imports.DBObject in Json für die Ausgabe zu konvertieren?

EDIT:

Aus Gründen der Klarheit, was ich wirklich tun wollen ist das Äquivalent von

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

In der gleichen Weise, dass ich

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

Haben Sie versucht, die 'Json.toJson() 'Funktion? (http://www.playframework.org/documentation/2.0.2/ScalaJson) –

+1

Nun, warum müssen Sie wirklich die Daten als JSON konvertieren? Es wird als JSON in db gespeichert (naja, bson wirklich), brauchst du wirklich das gleiche zurück? Ich denke, dass Sie nur Daten in ein Objekt basierend auf Ihrer gewünschten Struktur kopieren und dann in JSON serialisieren möchten ... – aishwarya

+1

Ich muss es als JSON für einen Webservice ausgeben ausgeben. – Roger

Antwort

4

schreiben kann ich was a schreckliche Lösung wie folgt;

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

Es muss sicherlich einen besseren Weg geben?

+0

Hey Roger, hast du jemals einen besseren Weg gefunden, Casbah DBObject in den JsValue von Play zu konvertieren? – teo

+0

Nachdem Sie "result" erhalten haben, wie würden Sie die Schlüsselwertfelder in eine Map einfügen? –

+0

Das ist eigentlich eine brillante Idee! Wenn die Leistung keine Rolle spielt (z. B. beim Schöndruck nicht), ist dies perfekt. Vielen Dank. – akauppi

5

Ich habe folgende

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

Sie können versuchen,

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

Dies sollte einen JSON-Array zurück mit Ihrer Alerts

Verwandte Themen