1

使用spray-json时,我需要为要序列化JsonFormat[A]的每个域类型引入一个隐式范围。A

推荐的方法是创建一个自定义对象,将所有隐式作为字段:

object MyJsonProtocol extends DefaultJsonProtocol {
  implicit val colorFormat = jsonFormat4(Color)
}

import MyJsonProtocol._

我的应用程序有很多域类型,其中一些有很长的名称。我MyJsonProtocol的变得冗长且难以阅读:

object MyJsonProtocol extends DefaultJsonProtocol {
  ... // many more here
  implicit val someClassWithALongNameFormat = jsonFormat4(SomeClassWithALongName)
  implicit val someClassWithALongNameInnerFormat = jsonFormat4(SomeClassWithALongNameInner)
  implicit val someClassWithALongNameVariantBFormat = jsonFormat4(SomeClassWithALongNameVariantB)
  ... // many more here
}

长 val 名称有各种问题:

  • 他们觉得多余(名字从未被读过)
  • 他们让我的台词很长
  • 它们引入了格式名称与格式类型不匹配的复制/粘贴风险
  • 他们使 RHS 值不对齐,这隐藏了这里的常见模式

有没有办法在不命名的情况下将对象带入隐式范围?这样的事情会更整洁:

object MyJsonProtocol extends DefaultJsonProtocol {
  ... // many more here
  implicit val _ = jsonFormat4(SomeClassWithALongName)
  implicit val _ = jsonFormat4(SomeClassWithALongNameInner)
  implicit val _ = jsonFormat4(SomeClassWithALongNameVariantB)
  ... // many more here
}

...但 Scala 不允许多个名为“_”的字段。

有没有办法将这些格式带入隐式范围而不用全部命名?还有另一种使用spray-json的方法可以避免这个问题吗?

4

1 回答 1

3

通常,我在伴随对象中定义类型类实例:

case class Foo()
object Foo {
  implicit val jsonFormatter = new JsonFormat[Foo] { ... }
}

case class Bar()
object Bar {
  implicit val jsonFormatter = new JsonFormat[Bar] { ... }
}

我不必导入任何内容,因为默认情况下伴随对象包含在隐式搜索范围内,并且隐式成员都可以具有相同的名称。

于 2014-05-06T10:39:32.213 回答