2017-01-08 15 views
1

Я пытаюсь разобрать MongoDB Extended JSON с использованием Circe JSON Parser, отлично работает в большинстве случаев, за исключением специальных типов данных, например. в классе ниже i у меня приоритетOrder, который имеет длинный тип данных.Пользовательский кодировщик/декодер для разбора MongoDB Extended JSON

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, тогда он не сможет сопоставить атрибут priorityOrder, есть ли способ написать собственный кодировщик/декодер, который будет обрабатывать длинный тип данных особым образом. Пользовательский кодировщик/декодер будет считывать значение из вложенного типа «$ numberLong» и преобразовывать это значение в длинный тип данных.

Я получаю это исключение из Circé парсера

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) 
     } 
    }