2011-06-02 14 views
7

Scala'yı öğreniyorum ve özelliklerin nasıl çalıştığını anlamaya çalışıyorum (özellikle Dispatch kitaplığı ile).Bir JSON isteğini Gönderme ile nasıl ayrıştırıyorsunuz?

Böyle bir şey var:

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

Maalesef> # dispatch.Request kayıtlı olmadığını şikayetçi. Özellik, dispatch.liftjson içinde açıklanmıştır ve benim kayıt olmam için bu özelliği (hangi kapakta olmalıdır) almam gerektiği varsayımdı.

cevap

5

dispatch.liftjson.Js._'dan ithalat yapıyor olmalısınız.

Bir özellik kullanmak, onu kullanmadığınız için yardımcı olmaz. JS._ içe aktarımı, nesnesinin tüm içeriğini trait ImplicitJsonVerbs'dan aldığı implicit conversionrequestToJsonVerbs da dahil olmak üzere kapsamınıza getirir. Bu yöntem, :/("example.com")/path numaralı Request standardında, ># yöntemine sahip olan JsonVerbs numaralı standart Dispatch dönüştürür.

Burada bir API sorgulamak nasıl bir kısaltılmış örneği verilmiştir:

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

Gördüğünüz gibi, ben ve benim Request ardından 'vardır' (bazı Lift Sevdiğim kütüphaneler için artı bazı) doğru ithalatı var ># yöntemi. ># değerini, beklenen imzayla ((JValue) ⇒ T) eşleşen bir işleve verdiğim yere veriyorum.

Merak ediyorsanız, özellikle lift-json'un kasa sınıflarını ayıklama yeteneğini kullanıyorum, yani TDevice olacaktır. Ancak, lift-json JValue'u Device'a dönüştüremiyorsa bir istisna atar, dolayısıyla tüm isteğimi Box döndürerek bir try-catch çağrısını silen bir Lift helper yöntemi olan Helper.tryo ile tamamladım. Box, standart Scala Option gibidir, ancak Failure eklenmesiyle, neden Box boş olduğunu belirtir. Yani, bu durumda ya bir Full[Device] ya da bir Failure alacağım. Kullanışlı!

İlgili konular