我正在实现一些使用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(…)
如何对任何案例类对象使用此类含义?
最佳答案 如果您指的是ProductFormatsInstances特性中的方法,则最多有22个参数的jsonFormat版本.如果你有一个包含22个以上参数的case类,我会看到两个直接选项.假设你有
case class Client(..., address: Address, telephone: Telephone, email: Email, ...)
>选项1:通过将较少的参数分解为更细粒度的类来减少参数数量.例如,您可以重构以下内容.
case class ClientContact(address: Address, telephone: Telephone, email: Email)
case class Client(..., contact: ClientContact, ...)
>选项2:通过实现RootJsonFormat编写自定义序列化程序.有关示例,请参见here.