我正在尝试使用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")
这样可行,但我将问题保持开放,因为仍然不清楚为什么这是必要的。
答案 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
。