2012-04-04 4 views
5

Ich bin neu in beiden Spielen! & Scala, aber ich versuche, einen Service zu machen, der die JSON-Anfrage auf eine Map [String, JsObject] (oder Map [String, JsValue] abbildet, bin mir über die Unterscheidung nicht sicher) und gebe dann eine Liste aus der Schlüssel rekursiv durch die Karte (vorzugsweise als Baum).JSON zum Zuordnen von [String, JsObject] mit Play 2.0?

Aber ich habe Anfang Probleme:

def genericJSONResponse = Action(parse.json) { 
    request => request.body 
    var keys = request.keys 
    Ok("OK") 
} 

Was ich hier erwarten würde, war für Schlüssel mit den Schlüsseln aus der Anforderung gefüllt werden, aber natürlich ist es nicht zu kompilieren. Wie soll ich das angesichts der obigen Beschreibung angehen?

Vielen Dank im Voraus für die Unterstützung einer Scala Noob aus :-)

Nik

+0

Haben Sie dieses Wiki gelesen? https://github.com/playframework/Play20/wiki/ScalaJsonRequests Sie müssen die Schlüssel manuell zuordnen oder mithilfe eines impliziten Objekts einem Objekt zuordnen. https://github.com/playframework/Play20/wiki/ScalaJsonGenerics –

Antwort

14

JsValue die Basisklasse für alle JSON-Werte ist. JsObject ist ein Subtyp von JsValue (zusammen mit JsNull, JsUndefined, JsBoolean, JsNumber, JsString und JsArray). Werfen Sie einen Blick auf JSON-Spezifikation, wenn es unklar ist: http://json.org/

Wenn Sie wissen, dass die JSON im Körper Anfrage ein JSON-Objekt ist (wie oben aufgeführt zu anderen Arten gegen) Sie können Muster passen es:

def genericJSONResponse = Action(parse.json) { request => 
    request.body match { 
    case JsObject(fields) => Ok("received object:" + fields.toMap + '\n') 
    case _ => Ok("received something else: " + request.body + '\n') 
    } 
} 

fields.toMap ist von der Art, die Sie wollten: Map[(String, JsValue)], so können Sie map oder collect verwenden, um die Schlüssel des Objekts rekursiv zu verarbeiten. (Übrigens können Sie fields direkt verwenden, da es ein Seq[(String, JsValue)] ist und map und collect auch unterstützt).

+1

Danke, das hat wunderbar funktioniert. :-) – niklassaers

+0

@niklassaers Ich bin froh, dass es dir gefällt. – romusz