You should be importing from dispatch.liftjson.Js._.
Having a trait isn't helpful, as you're not then using it. The JS._ import will bring all the contents of the JS object into your scope, including the implicit conversion requestToJsonVerbs which it has from trait ImplicitJsonVerbs. This method converts a standard Dispatch Request, which you have from :/("example.com") / path, to a JsonVerbs, which has the method >#.
Here's an abridged sample of how I query an 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]
})))
As you can see, I have the correct imports (plus some for some Lift libraries I like), and my Request then 'has' a ># method. I give ># a function that matches the expected signature ((JValue) ⇒ T) and away we go.
In case you're wondering, I'm specifically using lift-json's ability to extract to case classes, meaning that T will be Device. However, lift-json also throws an exception if it is unable to convert the JValue to a Device, so I've wrapped my whole request with Helper.tryo, a Lift helper method that wraps a try-catch call, returning a Box. Box is like the standard Scala Option but with the addition of Failure, which indicates why a Box is empty. So, in this case I will get either a Full[Device] or a Failure. Handy!