2015-11-03 61 views
2

我正在實施一些使用噴霧和akka的其他API API應該公開某種用戶CRUD。我只用在這個問題上創建用戶...如何無限制噴霧jsonFormat

case class User(id:String, name:String) 
case class Register(user:User, registrationId:String) 

trait DefaultJsonFormats extends DefaultJsonProtocol with SprayJsonSupport with MetaMarshallers {} 

class RegistrationService(registration: ActorRef) 
    (implicit executionContext: ExecutionContext) 
        extends Directives with DefaultJsonFormats { 
    implicit val timeout = Timeout(2.seconds) 
    implicit val userFormat = jsonFormat3(User) 
    implicit val registerFormat = jsonFormat1(Register) 
    implicit val registeredFormat = jsonFormat1(Registered) 

    val route = 
     path("register") { 
      post { handleWith { ru: Register => (registration ? ru).mapTo[Registered] } } 
} 

現在讓我們假設用戶類有30場 但沒有jsonFormat30(...) 如何使用這種implicits任何情況下,類對象?

+0

你可以使用https://github.com/fommil/spray-json-shapeless,它與case class> 30參數一起工作很好,雖然期望編譯時間稍長。 – knutwalker

回答

1

如果您指的是ProductFormatsInstances特徵中的方法,則有多達22個參數的jsonFormat版本。如果您的案例分類超過22個參數,我會看到兩個即時選項。假設你有

case class Client(..., address: Address, telephone: Telephone, email: Email, ...) 
  • 選項1:通過分解Client類爲以較少的參數細粒度類減少參數的數量。例如,您可以重構爲以下。

    case class ClientContact(address: Address, telephone: Telephone, email: Email) 
    case class Client(..., contact: ClientContact, ...) 
    
  • 選項2:通過實施RootJsonFormat編寫自定義的串行器。一個例子見here

+0

謝謝,API是我無法更改的對象。關於option2:你能舉一個例子來說明爲了添加實現而擴展的類特性。 – Julias

+0

我之前的建議是以'ProductFormatsInstances'中的方式編寫30個參數'jsonFormat'不能工作。由於Scala語言的限制,函數可以使用的最大參數數量是22(即scala包中沒有'Function23'或更高的參數)。如果選項1不可行,您應該仍然可以通過覆蓋'RootJsonFormat'來爲'User'類編寫自定義序列化程序。 – moem

+0

謝謝,我正在尋找如何做到這一點,但我對scala很陌生。你能否爲此添加一個例子。 – Julias