json - 如何无限制喷jsonFormat

标签 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(...) 如何对任何案例类对象使用此类隐式?

最佳答案

如果您引用的是 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举个例子。

关于json - 如何无限制喷jsonFormat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33494526/

相关文章:

list - 为什么 Scala 列表类名为::

Scala:通过 if 语句更正表示类型的类型推断

scala - 带有可变参数的案例类的隐式 jsonFormat

ios - ionic 下拉IOS

php - Mysql 正则表达式按数字选择

javascript - 蒙哥错误: "doc parameter must be an array of documents"

scala mixin 和单一初始化

scala - 将Elastic4s与 Elasticsearch 和喷雾路由一起使用时异常(exception)

scala - 组合喷射路由 + Actor 模式匹配

json - 如何解码可以是字符串 * 或 * 字符串数组的不一致 JSON 字段?