【发布时间】:2021-03-08 15:52:13
【问题描述】:
我有以下案例类:
case class SmartMeterData(
dateInterval: SmartMeterDataInterval = HalfHourInterval(),
powerUnit: PowerUnit = KWH,
smartMeterId: String,
timestamp: String,
value: Double
) {
def timeIntervalInDuration: FiniteDuration = dateInterval match {
case HalfHourInterval(_) => FiniteDuration(30, TimeUnit.MINUTES)
case FullHourInterval(_) => FiniteDuration(60, TimeUnit.MINUTES)
}
}
object SmartMeterData {
sealed trait SmartMeterDataInterval { def interval: String }
case class HalfHourInterval(interval: String = "HH") extends SmartMeterDataInterval
case class FullHourInterval(interval: String = "FH") extends SmartMeterDataInterval
sealed trait PowerUnit
case object WH extends PowerUnit
case object KWH extends PowerUnit
case object MWH extends PowerUnit
}
我刚刚写了一个非常简单的单元测试来看看 Circe 是否适用于我的场景:
"SmartMeterData" should "successfully parse from a valid JSON AST" in {
val js: String = """
{
"dateInterval" : "HH",
"powerUnit" : "KWH",
"smartMeterId" : "LCID-001-X-54",
"timestamp" : "2012-10-12 00:30:00.0000000",
"value" : 23.0
}
"""
val expectedSmartMeterData = SmartMeterData(smartMeterId = "LCID-001-X-54", timestamp = "2012-10-12 00:30:00.0000000", value = 23.0)
decode[SmartMeterData](js) match {
case Left(err) => fail(s"Error when parsing valid JSON ${err.toString}")
case Right(actualSmartMeterData) =>
assert(actualSmartMeterData equals expectedSmartMeterData)
}
}
但它失败并出现以下错误:
Error when parsing valid JSON DecodingFailure(CNil, List(DownField(dateInterval)))
circe 是否存在一个已知限制,它不适用于上述我的情况?
【问题讨论】:
-
你可以打印
expectedSmartMeterData.asJson,看看是{"dateInterval":{"HalfHourInterval":{"interval":"HH"}},"powerUnit":{"KWH":{}},"smartMeterId":"LCID-001-X-54","timestamp":"2012-10-12 00:30:00.0000000","value":23.0}。
标签: json scala shapeless circe