Spray JSON无法序列化case类

Spray JSON无法序列化case类,json,scala,spray,Json,Scala,Spray,我正在尝试使用Spray将以下case类转换为JSON或从JSON转换为: case class Interval(lower: Int, upper: Int) 这是通过以下方式实现的: implicit val intervalFormat = jsonFormat2(Interval) 这会编译,但会出现运行时错误: 无法自动确定“Interval”的案例类字段名和顺序,请使用带有显式字段名规范的“jsonFormat”重载 对该错误的搜索表明,它通常在子类声明其他字段时出现,而这里的

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

case class Interval(lower: Int, upper: Int)
这是通过以下方式实现的:

implicit val intervalFormat = jsonFormat2(Interval)
这会编译,但会出现运行时错误:

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

对该错误的搜索表明,它通常在子类声明其他字段时出现,而这里的情况并非如此

我是否错误地认为Spray应该能够自动格式化interval类

如果是这样的话,那么正如错误消息所显示的那样,我是否应该为格式化程序提供有关Interval字段的更明确的信息?如何最容易做到这一点

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

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

这是可行的,但我不想回答这个问题,因为还不清楚为什么需要这样做。

此错误的常见原因:

如果您在某个地方有一个case对象Interval,那么应该像jsonFormat2Interval.apply一样创建jsonFormat。 向格式中添加类型注释会有所帮助:隐式val intervalFormat:RootJsonFormat[Interval]=。。。 您的Interval类可能会与另一个Interval类(可能是org.joda.time.Interval)混淆,无论是在jsonFormat创建中,还是在case类创建或序列化的位置-您可以添加前缀或修复导入来避免这种情况。 希望这有帮助

编辑:我刚才遇到这个问题的另一个原因是,如果在case类中声明了任何val,序列化程序将无法自动生成格式。例如

case class Interval(from: Int, to: Int) {
  val size: Int = to - from
}
错误将是java.lang.RuntimeException:Case类间隔声明了其他字段


这可以通过如上所述使用jsonFormat重载来解决,或者可以简单地将val更改为def。

此错误的常见原因:

如果您在某个地方有一个case对象Interval,那么应该像jsonFormat2Interval.apply一样创建jsonFormat。 向格式中添加类型注释会有所帮助:隐式val intervalFormat:RootJsonFormat[Interval]=。。。 您的Interval类可能会与另一个Interval类(可能是org.joda.time.Interval)混淆,无论是在jsonFormat创建中,还是在case类创建或序列化的位置-您可以添加前缀或修复导入来避免这种情况。 希望这有帮助

编辑:我刚才遇到这个问题的另一个原因是,如果在case类中声明了任何val,序列化程序将无法自动生成格式。例如

case class Interval(from: Int, to: Int) {
  val size: Int = to - from
}
错误将是java.lang.RuntimeException:Case类间隔声明了其他字段


这可以通过使用如上所述的jsonFormat重载来解决,或者可以简单地将val更改为def。

您的隐式val intervalFormat是否在您得到错误的范围内?是的,谢谢-否则它可能不会编译。您可以发布一个最小的工作示例吗?考虑到你目前发布的代码,我看不出这是怎么回事。我怀疑问题出在您尚未包含的某些代码中。请尝试jsoniter scala:它非常方便和高效。您的隐式val intervalFormat是否在出现错误的范围内?是的,谢谢-否则可能无法编译。能否发布一个最简单的工作示例?考虑到你目前发布的代码,我看不出这是怎么回事。我怀疑问题出在您尚未包含的某些代码中。试试jsoniter scala:它非常方便和高效。