Spray JSON无法序列化案例类

时间:2018-05-08 13:34:05

标签: json scala spray

我正在尝试使用Spray将以下案例类转换为JSON或从JSON转换:

case class Interval(lower: Int, upper: Int)

这是通过以下方式实现的:

implicit val intervalFormat = jsonFormat2(Interval)

这会编译,但会给出运行时错误:

  

无法自动确定案例类字段名称和“Interval”的顺序,请使用带有显式字段名称规范的'jsonFormat'重载

对此错误的搜索表明,当子类声明其他字段时通常会出现这种情况,而这种情况并非如此。

我错误地认为Spray应该能够自动格式化间隔类吗?

如果是这样,那么(如显示的错误消息)我应该提供一个格式化程序,其中包含有关Interval字段的更明确信息吗?如何最容易实现这一目标?

编辑:@retrospectacus的答案提供了一些有用的观点,但没有一个能解决问题。我采用的解决方法是提供字段类型和名称的明确描述:

implicit val intervalFormat = jsonFormat[Int, Int,Interval](Interval, "lower", "upper")

这样可行,但我将问题保持开放,因为仍然不清楚为什么这是必要的。

1 个答案:

答案 0 :(得分:3)

此错误的常见原因:

  • 如果某个地方有case object Interval(随播广告),则应创建jsonFormat,如jsonFormat2(Interval.apply)
  • 在格式中添加类型注释可以提供帮助:implicit val intervalFormat: RootJsonFormat[Interval] = ...
  • 你的Interval类可能会与另一个Interval类混淆,可能是org.joda.time.Interval,无论是在jsonFormat创建中还是在case类创建或序列化的位置 - 你都可以添加一个前缀或者修复导入以避免这种情况。

希望这有帮助。

编辑:我刚刚遇到此问题的另一个原因是,如果您在案例类中声明了任何val,则序列化程序无法自动生成格式。 E.g。

case class Interval(from: Int, to: Int) {
  val size: Int = to - from
}

错误将是" java.lang.RuntimeException:Case类Interval声明了其他字段"。

如上所述,可以使用jsonFormat重载来解决此问题,或者val可以简单地更改为def