2012-04-04 16 views
5

Sono nuovo ad entrambi Play! & Scala, ma sto cercando di creare un servizio che mapperà la richiesta JSON a una mappa [String, JsObject] (o Map [String, JsValue], non sono sicuro della distinzione), quindi restituirò un elenco dei tasti ricorsivamente attraverso la mappa (preferibilmente come un albero).JSON per mappare [String, JsObject] con Play 2.0?

ma sto avendo problemi di inizio:

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

quello che mi aspettavo qui era per le chiavi per essere riempito con le chiavi dalla richiesta, ma, naturalmente, non si compila. Come devo affrontare questo, data la descrizione sopra?

Grazie in anticipo per aiutare un noob Scala :-)

Nik

+0

Hai letto questo wiki? https://github.com/playframework/Play20/wiki/ScalaJsonRequests Dovrai mappare le chiavi manualmente o utilizzare un oggetto implicito per mapparle su un oggetto. https://github.com/playframework/Play20/wiki/ScalaJsonGenerics –

risposta

14

JsValue è la classe base per tutti i valori JSON. JsObject è un sottotipo di JsValue (insieme a JsNull, JsUndefined, JsBoolean, JsNumber, JsString e JsArray). Date un'occhiata a JSON spec se non è chiaro: http://json.org/

se si sa che il JSON nella richiesta corpo è un oggetto JSON (a differenza di altri tipi di cui sopra) è possibile pattern-abbinarlo:

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 è di tipo desiderato: Map[(String, JsValue)] in modo da poter utilizzare map o collect per elaborare le chiavi dell'oggetto in modo ricorsivo. (A proposito, è possibile utilizzare direttamente fields, poiché è un Seq[(String, JsValue)] e supporta anche map e collect).

+1

Grazie, ha funzionato magnificamente. :-) – niklassaers

+0

@niklassaers Sono contento che ti piaccia. – romusz