如何无限制地喷jsonFormat

时间:2015-11-03 08:33:05

标签: json scala spray

我正在实现一些使用spray和akka的rest API API应该暴露某种用户CRUD。我只会在这个问题中使用创建用户......

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

现在让我们假设User类有30个字段   但是没有jsonFormat30(...) 如何对任何案例类对象使用此类含义?

1 个答案:

答案 0 :(得分:1)

如果您指的是ProductFormatsInstances特征中的方法,则有jsonFormat个版本最多22个参数。如果你有一个包含22个以上参数的case类,我会看到两个直接选项。假设你有

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