Пользовательский кодировщик / декодер для анализа MongoDB Extended JSON
Я пытаюсь проанализировать MongoDB Extended JSON с помощью Circe JSON Parser, работает нормально в большинстве случаев, за исключением специальных типов данных, например. В приведенном ниже классе у меня есть priorityOrder, который имеет длинный тип данных.
case class relinfo(id:String,assetId:String,insureeId:String,queue:String,priorityOrder:Long) extends baseDomain
Но когда он конвертируется в формат MongoDB JSON, он конвертируется в специальный формат монго, описанный ниже (проверьте поле 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 Parser, то он не может отобразить атрибут priorityOrder, есть ли способ написать собственный кодер / декодер, который будет обрабатывать длинные данные введите специальным образом. Пользовательский кодер / декодер будет считывать значение из вложенного типа "$numberLong" и преобразовывать это значение в тип данных Long.
Я получаю это исключение от Circe Parser
Left(DecodingFailure(Long, List(El(DownField(priorityOrder),true,false))))
1 ответ
Я смог найти решение этой проблемы, создав собственный декодер для длинных типов данных. Вот код для людей в аналогичной лодке
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)
}
}