Вы должны импортировать из dispatch.liftjson.Js._
.
Наличие черты не полезно, так как вы не используете ее. При импорте JS._
все содержимое объекта JS
попадет в вашу область видимости, включая неявное преобразование requestToJsonVerbs
, которое имеет значение trait ImplicitJsonVerbs
. Этот метод преобразует стандартную диспетчеризацию Request
, которая у вас есть от :/("example.com") / path
, в JsonVerbs
, которая имеет метод >#
.
Вот сокращенный пример того, как я запрашиваю 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]
})))
Как видите, у меня есть правильный импорт (плюс некоторые для некоторых библиотек Lift , которые мне нравятся), и у моего Request
тогда 'есть' метод >#
. Я даю >#
функцию, которая соответствует ожидаемой сигнатуре ((JValue) ⇒ T
), и мы уходим.
В случае, если вам интересно, я специально использую способность lift-json для извлечения в классы дел, то есть T
будет Device
. Тем не менее, lift-json также выдает исключение, если не может преобразовать JValue
в Device
, поэтому я поместил весь запрос в Helper.tryo
, вспомогательный метод Lift, который оборачивает вызов try-catch возвращая Box
. Box
похож на стандартную Scala Option
, но с добавлением Failure
, что указывает, почему Box
пусто. Итак, в этом случае я получу либо Full[Device]
, либо Failure
. Handy!