我正在尝试使用Circe JSON Parser解析MongoDB扩展JSON,在大多数情况下工作正常,除了特殊数据类型,例如。在下面的case类中,我有priorityOrder,它是long数据类型。
case class relinfo(id:String,assetId:String,insureeId:String,queue:String,priorityOrder:Long) extends baseDomain
但是当它转换为MongoDB JSON格式时,会转换为下面描述的特殊mongo格式(检查priorityOrder字段)
{
"_id" : "4abf009d-64b1-496c-b0e8-9061f5e183a0",
"id" : "4abf009d-64b1-496c-b0e8-9061f5e183a0",
"assetId" : "e26d5310-ab0c-4672-9971-4babd3420302",
"insureeId" : "cdee05a1-a09c-4e10-81df-c3f112298cc3",
"queue" : "Low",
"priorityOrder" : {
"$numberLong" : "1930926795621"
}
}
挑战是在反序列化过程中,如果我尝试使用此JSON并使用circe解析器转换回具体对象类型然后它无法映射priorityOrder属性,有什么方法我可以编写自定义编码器/解码器将以特殊方式处理长数据类型。自定义编码器/解码器将从" $ numberLong"中读取值。嵌套类型并将该值转换为Long数据类型。
我从circe解析器
获得此异常Left(DecodingFailure(Long, List(El(DownField(priorityOrder),true,false))))
答案 0 :(得分:1)
通过为long数据类型创建自定义解码器,我能够找到解决此问题的方法。以下是类似船上个人的代码
implicit val decodeLong: Decoder[Long] = new Decoder[Long] {
final def apply(c: HCursor): Decoder.Result[Long] =
{
val longval = c.downField("$numberLong").as[String] match
{
case Right(x) => x.toLong
case _ => throw new Exception("Unable to find $numberLong")
}
Right(longval)
}
}