2011-06-02 17 views
7

Estoy aprendiendo sobre Scala y tratando de entender cómo funcionan los rasgos (específicamente con la biblioteca de Despacho).¿Cómo se analiza una solicitud JSON con Despacho?

Tengo algo como esto:

import dispatch._ 
import dispatch.liftjson._ 

object Foo 
{ 
    def main(cmd: Array[String]) 
    { 
     val http = new Http; 
     val req = :/("example.com")/path ># (list ! obj); 
     val res = http(req); 
    } 
} 

Por desgracia, se queja de que> # No se ha registrado en dispatch.Request. El rasgo se describe en dispatch.liftjson, y asumí que solo debería importar ese rasgo (que debería cubrir) para que se registre.

Respuesta

5

Debe importar de dispatch.liftjson.Js._.

Tener un rasgo no es útil, ya que no lo está usando. La importación JS._ traerá todo el contenido del objeto JS a su alcance, incluido el implicit conversionrequestToJsonVerbs que tiene desde trait ImplicitJsonVerbs. Este método convierte un envío estándar Request, que tiene desde :/("example.com")/path, a un JsonVerbs, que tiene el método >#.

Aquí está una muestra abreviada de cómo consultar un API:

import dispatch._ 
import dispatch.liftjson.Js._ 

import net.liftweb.common.{Box, Failure, Full} 
import net.liftweb.util.Helpers 

case class Device(device_token: String, alias: Option[String]) 

val req = devicesReq/device_token as (app_token, secret) 
Helpers.tryo(http(req ># (json => { 
    json.extract[Device] 
}))) 

Como se puede ver, tengo las importaciones correctas (además de algunos de algunos Lift bibliotecas que me gustan), y mi Request luego 'tiene' un método >#. Doy a ># una función que coincida con la firma esperada ((JValue) ⇒ T) y nos vamos.

En caso de que se lo esté preguntando, específicamente estoy usando la capacidad de lift-json para extraer a clases de casos, lo que significa que T será Device. Sin embargo, lift-json también arroja una excepción si no puede convertir el JValue a Device, así que he envuelto toda mi solicitud con Helper.tryo, un método de ayuda de elevación que ajusta una llamada try-catch, devolviendo un Box. Box es como el estándar Scala Option pero con la adición de Failure, que indica por qué un Box está vacío. Entonces, en este caso obtendré un Full[Device] o un Failure. ¡Práctico!

Cuestiones relacionadas