2012-04-04 15 views
5

Jestem nowy zarówno w Play! & Scala, ale próbuję utworzyć usługę, która odwzoruje żądanie JSON na Map [String, JsObject] (lub Map [String, JsValue], nie jestem pewien co do rozróżnienia), a następnie wypisze listę kluczy rekursywnie przez mapę (najlepiej jako drzewo).JSON na mapę [String, JsObject] z wersją Play 2.0?

ale mam problemy startowe:

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

co by się spodziewać tutaj było na klucze do obsadzenia z kluczami od złożenia wniosku, ale oczywiście to nie kompiluje. Jak mam się do tego podejść, biorąc pod uwagę powyższy opis?

Dzięki z góry za pomagając noob Scala :-)

Nik

+0

Czy przeczytałeś tę wiki? https://github.com/playframework/Play20/wiki/ScalaJsonRequests Musisz mapować klucze ręcznie lub używając niejawnego obiektu, aby odwzorować je na obiekt. https://github.com/playframework/Play20/wiki/ScalaJsonGenerics –

Odpowiedz

14

JsValue jest klasą bazową dla wszystkich wartości JSON. JsObject jest podtypem JsValue (wraz z JsNull, JsUndefined, JsBoolean, JsNumber, JsString i JsArray). Spójrz na JSON specyfikacji, czy to jasne: http://json.org/

Jeśli wiesz, że JSON we wniosku ciała jest obiekt JSON (w przeciwieństwie do innych rodzajów wymienionych powyżej) można wzorca dopasować go:

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 jest typu, którego chciałeś: Map[(String, JsValue)], więc możesz użyć map lub collect do rekurencyjnego przetwarzania kluczy obiektu. (Nawiasem mówiąc, możesz użyć bezpośrednio fields, ponieważ jest to Seq[(String, JsValue)] i obsługuje także map i collect).

+1

Dzięki, że zadziałało pięknie. :-) – niklassaers

+0

@niklassaers Cieszę się, że Ci się podoba. – romusz