How to unlimit spray jsonFormat

2019-02-18 08:08发布

I'm implementing some rest API that use spray and akka The API should expose some kind of user CRUD. I'll use only create user in this question...

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

Now Lets suppose that User class has 30 fields but there is no jsonFormat30(...) How can I use such implicits for any case class object?

标签: json scala spray
1条回答
冷血范
2楼-- · 2019-02-18 08:25

If you are referring to the methods in the ProductFormatsInstances trait, there are versions of jsonFormat up to 22 parameters. If you have a case class with more than 22 parameters, I see two immediate options. Suppose you have

case class Client(..., address: Address, telephone: Telephone, email: Email, ...)
  • Options 1: reduce the number of parameters by breaking down the Client class into finer-grained classes taking fewer parameters.. For example, you can refactor to the following.

    case class ClientContact(address: Address, telephone: Telephone, email: Email)
    case class Client(..., contact: ClientContact, ...)
    
  • Options 2: write a custom serialiser by implementing RootJsonFormat. See here for an example.

查看更多
登录 后发表回答