2011-06-02 186 views
7

我正在學習Scala,並嘗試瞭解特質如何工作(特別是調度庫)。如何使用Dispatch解析JSON請求?

我有這樣的事情:

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); 
    } 
} 

不幸的是,它的抱怨>#不與dispatch.Request註冊。這個特質在dispatch.liftjson中有描述,而且我的假設是我應該只需要導入該特性(應該覆蓋)以便註冊。

回答

5

您應該從dispatch.liftjson.Js._導入。

擁有特質並沒有什麼幫助,因爲您之後沒有使用它。導入JS._將會將JS對象的所有內容納入您的範圍,包括implicit conversionrequestToJsonVerbs它具有trait ImplicitJsonVerbs。此方法將您從:/("example.com")/path獲得的標準Dispatch Request轉換爲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的能力來提取案例類,這意味着TDevice。但是,如果lift-json無法將JValue轉換爲Device,則它也會引發異常,所以我用Helper.tryo(一種包裝try-catch調用的lift助手方法,返回Box)封裝了我的整個請求。 Box與標準Scala Option類似,但增加了Failure,這表明Box爲空的原因。所以,在這種情況下,我會得到一個Full[Device]Failure。便利!