2012-04-04 13 views
5

¡Soy nuevo en ambos juegos! & Scala, pero estoy tratando de hacer un servicio que mapeará la solicitud JSON a un mapa [String, JsObject] (o Map [String, JsValue], no estoy seguro de la distinción), y luego mostrar una lista de las claves recursivamente a través del mapa (preferiblemente como un árbol).JSON para asignar [String, JsObject] con Play 2.0?

pero estoy teniendo problemas de inicio:

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

lo que esperaría aquí fue para las claves para ser llenados con las llaves de la solicitud, pero por supuesto, no compila. ¿Cómo debería abordar esto, dada la descripción anterior?

Gracias de antemano por ayudar a un novato Scala :-)

Nik

+0

¿Has leído este wiki? https://github.com/playframework/Play20/wiki/ScalaJsonRequests Deberá asignar las claves manualmente o usar un objeto implícito para asignarlas a un objeto. https://github.com/playframework/Play20/wiki/ScalaJsonGenerics –

Respuesta

14

JsValue es la clase base para todos los valores JSON. JsObject es un subtipo de JsValue (junto con JsNull, JsUndefined, JsBoolean, JsNumber, JsString, y JsArray). Echar un vistazo a las especificaciones JSON si no está claro: http://json.org/

si sabe que el JSON en la solicitud cuerpo es un objeto JSON (a diferencia de otros tipos mencionados anteriormente) se puede patrón-igualarlo:

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 es del tipo que quería: Map[(String, JsValue)] para que pueda usar map o collect para procesar las claves del objeto recursivamente. (Por cierto, puede usar fields directamente, ya que es Seq[(String, JsValue)] y admite map y collect también).

+1

Gracias, funcionó muy bien. :-) – niklassaers

+0

@niklassaers Me alegro de que te guste. – romusz