Пользовательский кодировщик / декодер для анализа 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)  
        }
  }
Другие вопросы по тегам