Circe没有理由不工作,但根据您设计数据模型的方式,任何Scala JSON库都不可能自动生成编码器/解码器,而无需大量手动工作。
例如
sealed trait SmartMeterDataInterval { def interval: String }
case class HalfHourInterval(interval: String = "HH") extends SmartMeterDataInterval
case class FullHourInterval(interval: String = "FH") extends SmartMeterDataInterval
两者的模式,在任何Scala JSON库中,该库会自动为
case class
es,将沿着以下路线
{ "interval": "HH" }
对于
HalfHourInterval
和
{ "interval": "FH" }
对于
FullHourInterval
(即,因为每个字段都有一个名为
interval
,它们实际上是同一类)。事实上,你的模型允许你
FullHourInterval("HH")
,对于至少一种为ADT层次结构生成解码器的方法(文档中使用无形状的方法),这将是解码的结果
{ "interval": "HH" }
,因为这基本上需要符合词法顺序的第一个构造函数(即。
全时间隔
). 如果目的是只允许整小时或半小时的间隔,那么我建议这样表达:
case object HalfHourInterval extends SmartMeterDataInterval { def interval: String = "HH" }
case object FullHourInterval extends SmartMeterDataInterval { def interval: String = "FH" }
我并不直接熟悉circe的编码方式
case object
s、 但是你可以很容易地定义一个编码器和解码器
SmartMeterDataInterval
:
object SmartMeterDataInterval {
implicit val encoder: Encoder[SmartMeterDataInterval] =
Encoder.encodeString.contramap[SmartMeterDataInterval](_.interval)
implicit val decoder: Decoder[SmartMeterDataInterval] =
Decoder.decodeString.emap {
case "HH" => Right(HalfHourInterval)
case "FH" => Right(FullHourInterval)
case _ => Left("not a valid SmartMeterDataInterval")
}
}
然后,你会做类似的事情来定义
Encoder
/
Decoder
对于
PowerUnit